From 8ae612f6930235aa1768d3a5beeff65a3565d90a Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Tue, 10 Sep 2013 20:19:42 +0200 Subject: [PATCH 001/293] Move core setup code to controller class --- core/setup.php | 59 ----------------------------- core/setup/controller.php | 79 +++++++++++++++++++++++++++++++++++++++ lib/base.php | 3 +- 3 files changed, 81 insertions(+), 60 deletions(-) delete mode 100644 core/setup.php create mode 100644 core/setup/controller.php diff --git a/core/setup.php b/core/setup.php deleted file mode 100644 index 4758c23b04..0000000000 --- a/core/setup.php +++ /dev/null @@ -1,59 +0,0 @@ - $hasSQLite, - 'hasMySQL' => $hasMySQL, - 'hasPostgreSQL' => $hasPostgreSQL, - 'hasOracle' => $hasOracle, - 'hasMSSQL' => $hasMSSQL, - 'directory' => $datadir, - 'secureRNG' => OC_Util::secureRNGAvailable(), - 'htaccessWorking' => OC_Util::isHtAccessWorking(), - 'vulnerableToNullByte' => $vulnerableToNullByte, - 'errors' => array(), -); - -if(isset($_POST['install']) AND $_POST['install']=='true') { - // We have to launch the installation process : - $e = OC_Setup::install($_POST); - $errors = array('errors' => $e); - - if(count($e) > 0) { - //OC_Template::printGuestPage("", "error", array("errors" => $errors)); - $options = array_merge($_POST, $opts, $errors); - OC_Template::printGuestPage("", "installation", $options); - } - else { - header( 'Location: '.OC_Helper::linkToRoute( 'post_setup_check' )); - exit(); - } -} -else { - OC_Template::printGuestPage("", "installation", $opts); -} diff --git a/core/setup/controller.php b/core/setup/controller.php new file mode 100644 index 0000000000..54bfe14612 --- /dev/null +++ b/core/setup/controller.php @@ -0,0 +1,79 @@ +loadAutoConfig($post); + $opts = $this->getSystemInfo(); + + if(isset($post['install']) AND $post['install']=='true') { + // We have to launch the installation process : + $e = \OC_Setup::install($post); + $errors = array('errors' => $e); + + if(count($e) > 0) { + $options = array_merge($post, $opts, $errors); + $this->display($options); + } + else { + $this->finishSetup(); + } + } + else { + $this->display($opts); + } + } + + public function display($post) { + \OC_Util::addScript('setup'); + \OC_Template::printGuestPage('', 'installation', $post); + } + + public function finishSetup() { + header( 'Location: '.\OC_Helper::linkToRoute( 'post_setup_check' )); + exit(); + } + + public function loadAutoConfig($post) { + $autosetup_file = \OC::$SERVERROOT.'/config/autoconfig.php'; + if( file_exists( $autosetup_file )) { + \OC_Log::write('core', 'Autoconfig file found, setting up owncloud...', \OC_Log::INFO); + include $autosetup_file; + $post['install'] = 'true'; + $post = array_merge ($post, $AUTOCONFIG); + unlink($autosetup_file); + } + return $post; + } + + public function getSystemInfo() { + $hasSQLite = class_exists('SQLite3'); + $hasMySQL = is_callable('mysql_connect'); + $hasPostgreSQL = is_callable('pg_connect'); + $hasOracle = is_callable('oci_connect'); + $hasMSSQL = is_callable('sqlsrv_connect'); + $datadir = \OC_Config::getValue('datadirectory', \OC::$SERVERROOT.'/data'); + $vulnerableToNullByte = false; + if(@file_exists(__FILE__."\0Nullbyte")) { // Check if the used PHP version is vulnerable to the NULL Byte attack (CVE-2006-7243) + $vulnerableToNullByte = true; + } + + // Protect data directory here, so we can test if the protection is working + \OC_Setup::protectDataDirectory(); + + return array( + 'hasSQLite' => $hasSQLite, + 'hasMySQL' => $hasMySQL, + 'hasPostgreSQL' => $hasPostgreSQL, + 'hasOracle' => $hasOracle, + 'hasMSSQL' => $hasMSSQL, + 'directory' => $datadir, + 'secureRNG' => \OC_Util::secureRNGAvailable(), + 'htaccessWorking' => \OC_Util::isHtAccessWorking(), + 'vulnerableToNullByte' => $vulnerableToNullByte, + 'errors' => array(), + ); + } +} diff --git a/lib/base.php b/lib/base.php index ea5adbadc9..aa91176d21 100644 --- a/lib/base.php +++ b/lib/base.php @@ -610,7 +610,8 @@ class OC { // Check if ownCloud is installed or in maintenance (update) mode if (!OC_Config::getValue('installed', false)) { - require_once 'core/setup.php'; + $controller = new OC\Core\Setup\Controller(); + $controller->run($_POST); exit(); } From 65aab3dc8c88f012e063ccea7cacc17f528b7d4d Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Tue, 10 Sep 2013 22:05:20 +0200 Subject: [PATCH 002/293] Check for failure in creating htaccessWorking testfile --- core/setup/controller.php | 14 ++++++++++++-- lib/util.php | 12 ++++++++---- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/core/setup/controller.php b/core/setup/controller.php index 54bfe14612..8ddcf19bb6 100644 --- a/core/setup/controller.php +++ b/core/setup/controller.php @@ -60,8 +60,18 @@ class Controller { $vulnerableToNullByte = true; } + $errors = array(); + // Protect data directory here, so we can test if the protection is working \OC_Setup::protectDataDirectory(); + try { + $htaccessworking = \OC_Util::isHtAccessWorking(); + } catch (\OC\HintException $e) { + $errors[] = array( + 'error' => $e->getMessage(), + 'hint' => $e->getHint() + ); + } return array( 'hasSQLite' => $hasSQLite, @@ -71,9 +81,9 @@ class Controller { 'hasMSSQL' => $hasMSSQL, 'directory' => $datadir, 'secureRNG' => \OC_Util::secureRNGAvailable(), - 'htaccessWorking' => \OC_Util::isHtAccessWorking(), + 'htaccessWorking' => $htaccessWorking, 'vulnerableToNullByte' => $vulnerableToNullByte, - 'errors' => array(), + 'errors' => $errors, ); } } diff --git a/lib/util.php b/lib/util.php index 0777643a95..e8e3bc37e5 100755 --- a/lib/util.php +++ b/lib/util.php @@ -689,9 +689,13 @@ class OC_Util { return false; } - $fp = @fopen($testfile, 'w'); - @fwrite($fp, $testcontent); - @fclose($fp); + $fp = @fopen($testFile, 'w'); + if (!$fp) { + throw new OC\HintException('Can\'t create test file to check for working .htaccess file.', + 'Make sure it is possible for the webserver to write to '.$testFile); + } + fwrite($fp, $testContent); + fclose($fp); // accessing the file via http $url = OC_Helper::makeURLAbsolute(OC::$WEBROOT.'/data'.$fileName); @@ -700,7 +704,7 @@ class OC_Util { @fclose($fp); // cleanup - @unlink($testfile); + @unlink($testFile); // does it work ? if($content==$testContent) { From 071b8033cb59a3ed51925374e78790ecfa7a2fac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Tue, 24 Sep 2013 00:44:55 +0200 Subject: [PATCH 003/293] fixing typo on $htaccessWorking - testing own code before pushing is appreciated --- core/setup/controller.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/setup/controller.php b/core/setup/controller.php index 8ddcf19bb6..e1ad9d60e8 100644 --- a/core/setup/controller.php +++ b/core/setup/controller.php @@ -64,8 +64,9 @@ class Controller { // Protect data directory here, so we can test if the protection is working \OC_Setup::protectDataDirectory(); + $htaccessWorking = false; try { - $htaccessworking = \OC_Util::isHtAccessWorking(); + $htaccessWorking = \OC_Util::isHtAccessWorking(); } catch (\OC\HintException $e) { $errors[] = array( 'error' => $e->getMessage(), From 5db98aadd30b9f1218dda8f836acca0062ce1d9f Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Wed, 2 Oct 2013 18:23:47 +0200 Subject: [PATCH 004/293] Copyright and small fix --- core/setup/controller.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/core/setup/controller.php b/core/setup/controller.php index e1ad9d60e8..9b35432f11 100644 --- a/core/setup/controller.php +++ b/core/setup/controller.php @@ -1,4 +1,10 @@ + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ namespace OC\Core\Setup; @@ -43,7 +49,7 @@ class Controller { include $autosetup_file; $post['install'] = 'true'; $post = array_merge ($post, $AUTOCONFIG); - unlink($autosetup_file); + @unlink($autosetup_file); } return $post; } From 39906cefbf0ee6e4d161c4a09c88194175d3d64e Mon Sep 17 00:00:00 2001 From: raghunayyar Date: Sun, 6 Oct 2013 23:28:22 +0530 Subject: [PATCH 005/293] Converts em to px values for styles in Files. --- apps/files/css/files.css | 28 ++++++++++++++-------------- apps/files/css/upload.css | 4 ++-- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/apps/files/css/files.css b/apps/files/css/files.css index e26c1a89b7..546451806e 100644 --- a/apps/files/css/files.css +++ b/apps/files/css/files.css @@ -3,7 +3,7 @@ See the COPYING-README file. */ /* FILE MENU */ -.actions { padding:.3em; height:2em; width: 100%; } +.actions { padding:5px; height:32px; width: 100%; } .actions input, .actions button, .actions .button { margin:0; float:left; } .actions .button a { color: #555; } .actions .button a:hover, .actions .button a:active { color: #333; } @@ -30,9 +30,9 @@ #new>ul { display: none; position: fixed; - min-width: 7em; + min-width: 112px; z-index: 10; - padding: .5em; + padding: 8px; padding-bottom: 0; margin-top: 14px; margin-left: -1px; @@ -43,7 +43,7 @@ border-top-left-radius: 0; box-shadow:0 2px 7px rgba(170,170,170,.4); } -#new>ul>li { height:36px; margin:.3em; padding-left:3em; padding-bottom:0.1em; +#new>ul>li { height:36px; margin:5px; padding-left:48px; padding-bottom:2px; background-repeat:no-repeat; cursor:pointer; } #new>ul>li>p { cursor:pointer; padding-top: 7px; padding-bottom: 7px;} @@ -56,7 +56,7 @@ top: 44px; width: 100%; } -#filestable tbody tr { background-color:#fff; height:2.5em; } +#filestable tbody tr { background-color:#fff; height:40px; } #filestable tbody tr:hover, tbody tr:active { background-color: rgb(240,240,240); } @@ -71,7 +71,7 @@ span.extension, span.uploading, td.date { color:#999; } span.extension { text-transform:lowercase; -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; } tr:hover span.extension { -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; filter:alpha(opacity=100); opacity:1; color:#777; } table tr.mouseOver td { background-color:#eee; } -table th { height:2em; padding:0 .5em; color:#999; } +table th { height:24px; padding:0 8px; color:#999; } table th .name { position: absolute; left: 55px; @@ -94,15 +94,15 @@ table th#headerName { height: 50px; } table th#headerSize, table td.filesize { - min-width: 3em; - padding: 0 1em; + min-width: 48px; + padding: 0 16px; text-align: right; } table th#headerDate, table td.date { -moz-box-sizing: border-box; box-sizing: border-box; position: relative; - min-width: 11em; + min-width: 176px; display: block; height: 51px; } @@ -173,8 +173,8 @@ table td.filename .nametext { text-overflow: ellipsis; max-width: 800px; } -table td.filename .uploadtext { font-weight:normal; margin-left:.5em; } -table td.filename form { font-size:.85em; margin-left:3em; margin-right:3em; } +table td.filename .uploadtext { font-weight:normal; margin-left:8px; } +table td.filename form { font-size:.85em; margin-left:48px; margin-right:48px; } /* File checkboxes */ @@ -247,7 +247,7 @@ table td.filename form { font-size:.85em; margin-left:3em; margin-right:3em; } box-shadow: -5px 0 7px rgba(230,230,230,.9); } -#fileList img.move2trash { display:inline; margin:-.5em 0; padding:1em .5em 1em .5em !important; float:right; } +#fileList img.move2trash { display:inline; margin:-.5em 0; padding:16px 8px 16px 8px !important; float:right; } #fileList a.action.delete { position: absolute; right: 0; @@ -271,13 +271,13 @@ a.action>img { max-height:16px; max-width:16px; vertical-align:text-bottom; } } .selectedActions a img { position:relative; - top:.3em; + top:5px; } #fileList a.action { display: inline; - margin: -.5em 0; + margin: -8px 0; padding: 18px 8px !important; -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; filter: alpha(opacity=0); diff --git a/apps/files/css/upload.css b/apps/files/css/upload.css index ef04356909..ddd2a67b81 100644 --- a/apps/files/css/upload.css +++ b/apps/files/css/upload.css @@ -5,7 +5,7 @@ height: 36px; width: 39px; padding: 0 !important; /* override default control bar button padding */ - margin-left: .2em; + margin-left: 3px; overflow: hidden; vertical-align: top; } @@ -33,7 +33,7 @@ height: 44px; margin: -5px -3px; padding: 0; - font-size: 1em; + font-size: 16px; -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; filter:alpha(opacity=0); opacity:0; z-index: 20; cursor: pointer; From cf84154ee09d9bc706a0343d03600f6ebfbde7a1 Mon Sep 17 00:00:00 2001 From: raghunayyar Date: Sun, 6 Oct 2013 23:38:24 +0530 Subject: [PATCH 006/293] Cleans up Core apps for relative(em) to absolute(px) styles. --- apps/files_external/css/settings.css | 4 ++-- apps/files_sharing/css/public.css | 28 ++++++++++++++-------------- apps/files_versions/css/versions.css | 2 +- apps/user_ldap/css/settings.css | 2 +- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/apps/files_external/css/settings.css b/apps/files_external/css/settings.css index f2f40247b2..4a32ac4153 100644 --- a/apps/files_external/css/settings.css +++ b/apps/files_external/css/settings.css @@ -16,8 +16,8 @@ span.waiting { background: none; } -td.mountPoint, td.backend { width:10em; } -td.remove>img { visibility:hidden; padding-top:0.8em; } +td.mountPoint, td.backend { width:160px; } +td.remove>img { visibility:hidden; padding-top:13px; } tr:hover>td.remove>img { visibility:visible; cursor:pointer; } #addMountPoint>td { border:none; } #addMountPoint>td.applicable { visibility:hidden; } diff --git a/apps/files_sharing/css/public.css b/apps/files_sharing/css/public.css index 3aa4a48304..70345c3577 100644 --- a/apps/files_sharing/css/public.css +++ b/apps/files_sharing/css/public.css @@ -4,14 +4,14 @@ body { #header { background: #1d2d44 url('%webroot%/core/img/noise.png') repeat; - height:2.5em; + height:40px; left:0; - line-height:2.5em; + line-height:40px; position:fixed; right:0; top:0; z-index:100; - padding:.5em; + padding:8px; } #details { @@ -22,7 +22,7 @@ body { #public_upload, #download { font-weight:700; - margin: 0 0.4em 0 0; + margin: 0 6px 0 0; padding: 0 5px; height: 27px; float: left; @@ -30,38 +30,38 @@ body { } .header-right #details { - margin-right: 2em; + margin-right: 32px; } #public_upload { - margin-left: 0.3em; + margin-left: 5px; } #public_upload img, #download img { - padding-left:.1em; - padding-right:.3em; + padding-left:2px; + padding-right:5px; vertical-align:text-bottom; } #preview { background:#eee; border-bottom:1px solid #f8f8f8; - min-height:30em; + min-height:480px; text-align:center; margin:45px auto; } #noPreview { display:none; - padding-top:5em; + padding-top:90px; } p.info { color:#777; text-align:center; - width:22em; - margin:2em auto; + width:352px; + margin:32px auto; } p.info a { @@ -71,8 +71,8 @@ p.info a { #imgframe { height:75%; - padding-bottom:2em; - padding-top:2em; + padding-bottom:32px; + padding-top:32px; width:80%; margin:0 auto; } diff --git a/apps/files_versions/css/versions.css b/apps/files_versions/css/versions.css index c53935711c..8838ea8484 100644 --- a/apps/files_versions/css/versions.css +++ b/apps/files_versions/css/versions.css @@ -1,5 +1,5 @@ #dropdown.drop-versions { - width:24em; + width:384em; } #found_versions li { diff --git a/apps/user_ldap/css/settings.css b/apps/user_ldap/css/settings.css index 6086c7b74e..55ca503adf 100644 --- a/apps/user_ldap/css/settings.css +++ b/apps/user_ldap/css/settings.css @@ -22,6 +22,6 @@ } .ldapwarning { - margin-left: 1.4em; + margin-left: 22px; color: #FF3B3B; } From 4687d2dd0bde3f689eb57c90d0c4341cd00991bd Mon Sep 17 00:00:00 2001 From: raghunayyar Date: Mon, 7 Oct 2013 00:01:29 +0530 Subject: [PATCH 007/293] All Core Styles from em->px, apart from styles.css --- core/css/auth.css | 12 ++++++------ core/css/jquery.multiselect.css | 2 +- core/css/multiselect.css | 20 ++++++++++---------- core/css/share.css | 20 ++++++++++---------- 4 files changed, 27 insertions(+), 27 deletions(-) diff --git a/core/css/auth.css b/core/css/auth.css index 0adc10c77d..70df9f0ae0 100644 --- a/core/css/auth.css +++ b/core/css/auth.css @@ -1,7 +1,7 @@ h2 { - font-size:2em; + font-size:32px; font-weight:700; - margin-bottom:1em; + margin-bottom:16px; white-space:nowrap; } @@ -18,8 +18,8 @@ h2 img { } #oauth { - width:20em; - margin:4em auto 2em; + width:320px; + margin:64px auto 32px; } #allow-auth { @@ -33,7 +33,7 @@ h2 img { background:none; border:0; box-shadow:0 0 0 #fff, 0 0 0 #fff inset; - font-size:1.2em; - margin:.7em; + font-size:19px; + margin:11px; padding:0; } diff --git a/core/css/jquery.multiselect.css b/core/css/jquery.multiselect.css index 898786a615..6b3ae47d6e 100644 --- a/core/css/jquery.multiselect.css +++ b/core/css/jquery.multiselect.css @@ -4,7 +4,7 @@ .ui-multiselect-single .ui-multiselect-checkboxes label { padding:5px !important } .ui-multiselect-header { margin-bottom:3px; padding:3px 0 3px 4px } -.ui-multiselect-header ul { font-size:0.9em } +.ui-multiselect-header ul { font-size:15px } .ui-multiselect-header ul li { float:left; padding:0 10px 0 0 } .ui-multiselect-header a { text-decoration:none } .ui-multiselect-header a:hover { text-decoration:underline } diff --git a/core/css/multiselect.css b/core/css/multiselect.css index c25446808e..a8ec6e88fd 100644 --- a/core/css/multiselect.css +++ b/core/css/multiselect.css @@ -7,7 +7,7 @@ ul.multiselectoptions { border: 1px solid #ddd; border-top: none; box-shadow: 0 1px 1px #ddd; - padding-top: .5em; + padding-top: 8px; position: absolute; max-height: 20em; overflow-y: auto; @@ -15,8 +15,8 @@ ul.multiselectoptions { } ul.multiselectoptions.down { - border-bottom-left-radius: .5em; - border-bottom-right-radius: .5em; + border-bottom-left-radius: 8px; + border-bottom-right-radius: 8px; width: 100%; /* do not cut off group names */ -webkit-box-shadow: 0px 0px 20px rgba(29,45,68,.4); -moz-box-shadow: 0px 0px 20px rgba(29,45,68,.4); @@ -24,8 +24,8 @@ ul.multiselectoptions.down { } ul.multiselectoptions.up { - border-top-left-radius: .5em; - border-top-right-radius: .5em; + border-top-left-radius: 8px; + border-top-right-radius: 8px; } ul.multiselectoptions>li { @@ -52,7 +52,7 @@ div.multiselect { display: inline-block; max-width: 400px; min-width: 150px; - padding-right: .6em; + padding-right: 10px; position: relative; vertical-align: bottom; } @@ -77,7 +77,7 @@ div.multiselect.down { div.multiselect>span:first-child { float: left; - margin-right: 2em; + margin-right: 32px; overflow: hidden; text-overflow: ellipsis; width: 90%; @@ -85,12 +85,12 @@ div.multiselect>span:first-child { div.multiselect>span:last-child { position: absolute; - right: .8em; + right: 13px; } ul.multiselectoptions input.new { - padding-bottom: .2em; - padding-top: .2em; + padding-bottom: 3px; + padding-top: 3px; margin: 0; } diff --git a/core/css/share.css b/core/css/share.css index 2a21dc6edf..ded68349dc 100644 --- a/core/css/share.css +++ b/core/css/share.css @@ -8,21 +8,21 @@ border-bottom-right-radius: 5px; box-shadow:0 1px 1px #777; display:block; - margin-right:7em; + margin-right:112px; position:absolute; right:0; - width:25em; + width:400px; z-index:500; - padding:1em; + padding:16px; } #shareWithList { list-style-type:none; - padding:.5em; + padding:8px; } #shareWithList li { - padding-top:.1em; + padding-top:2px; } #shareWithList li:first-child { @@ -42,7 +42,7 @@ } #dropdown input[type="checkbox"] { - margin:0 .2em 0 .5em; + margin:0 3px 0 8px; } a.showCruds { @@ -54,13 +54,13 @@ a.unshare { display:inline; float:right; opacity:.5; - padding:.3em 0 0 .3em !important; + padding:5px 0 0 5px !important; margin-top:-5px; } #link { border-top:1px solid #ddd; - padding-top:.5em; + padding-top:8px; } #dropdown input[type="text"],#dropdown input[type="password"] { @@ -78,12 +78,12 @@ a.unshare { } #link #showPassword img { - padding-left:.3em; + padding-left:5px; width:12px; } .reshare,#link label,#expiration label { - padding-left:.5em; + padding-left:8px; } a.showCruds:hover,a.unshare:hover { From 09d2ba017e603fe6ac237da7830d86d74b2da61c Mon Sep 17 00:00:00 2001 From: Morris Jobke Date: Mon, 7 Oct 2013 00:36:42 +0200 Subject: [PATCH 008/293] fix undefined $htaccessWorking --- core/setup/controller.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/setup/controller.php b/core/setup/controller.php index 9b35432f11..679efee81b 100644 --- a/core/setup/controller.php +++ b/core/setup/controller.php @@ -70,7 +70,6 @@ class Controller { // Protect data directory here, so we can test if the protection is working \OC_Setup::protectDataDirectory(); - $htaccessWorking = false; try { $htaccessWorking = \OC_Util::isHtAccessWorking(); } catch (\OC\HintException $e) { @@ -78,6 +77,7 @@ class Controller { 'error' => $e->getMessage(), 'hint' => $e->getHint() ); + $htaccessWorking = false; } return array( From b1f1357957c85c23ace4beed497df2128484d651 Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Wed, 9 Oct 2013 16:54:36 +0200 Subject: [PATCH 009/293] Added ownCloud backend for external storage To make it possible to use the short ownCloud URL (without specifying webdav.php or remote.php), a new backend is available for ownCloud. The user must specify the host + context path in the "Url" field (which is mapped to the "host" parameter) and the subdir to mount in the "Root" field. This is to prevent confusion because some users forget to append webdav.php or remote.php to the WebDAV URL. Fixes #4923 --- apps/files_external/appinfo/app.php | 1 + apps/files_external/lib/config.php | 26 +++++++++---- apps/files_external/lib/owncloud.php | 51 ++++++++++++++++++++++++++ apps/files_external/lib/webdav.php | 2 +- apps/files_external/tests/config.php | 7 ++++ apps/files_external/tests/owncloud.php | 31 ++++++++++++++++ 6 files changed, 109 insertions(+), 9 deletions(-) create mode 100644 apps/files_external/lib/owncloud.php create mode 100644 apps/files_external/tests/owncloud.php diff --git a/apps/files_external/appinfo/app.php b/apps/files_external/appinfo/app.php index dd0b76ed9d..070740fb4d 100644 --- a/apps/files_external/appinfo/app.php +++ b/apps/files_external/appinfo/app.php @@ -9,6 +9,7 @@ OC::$CLASSPATH['OC\Files\Storage\StreamWrapper'] = 'files_external/lib/streamwrapper.php'; OC::$CLASSPATH['OC\Files\Storage\FTP'] = 'files_external/lib/ftp.php'; OC::$CLASSPATH['OC\Files\Storage\DAV'] = 'files_external/lib/webdav.php'; +OC::$CLASSPATH['OC\Files\Storage\OwnCloud'] = 'files_external/lib/owncloud.php'; OC::$CLASSPATH['OC\Files\Storage\Google'] = 'files_external/lib/google.php'; OC::$CLASSPATH['OC\Files\Storage\SWIFT'] = 'files_external/lib/swift.php'; OC::$CLASSPATH['OC\Files\Storage\SMB'] = 'files_external/lib/smb.php'; diff --git a/apps/files_external/lib/config.php b/apps/files_external/lib/config.php index 659959e662..3f17b49007 100755 --- a/apps/files_external/lib/config.php +++ b/apps/files_external/lib/config.php @@ -106,14 +106,24 @@ class OC_Mount_Config { } } - if(OC_Mount_Config::checkcurl()) $backends['\OC\Files\Storage\DAV']=array( - 'backend' => 'ownCloud / WebDAV', - 'configuration' => array( - 'host' => 'URL', - 'user' => 'Username', - 'password' => '*Password', - 'root' => '&Root', - 'secure' => '!Secure https://')); + if(OC_Mount_Config::checkcurl()){ + $backends['\OC\Files\Storage\DAV']=array( + 'backend' => 'WebDAV', + 'configuration' => array( + 'host' => 'URL', + 'user' => 'Username', + 'password' => '*Password', + 'root' => '&Root', + 'secure' => '!Secure https://')); + $backends['\OC\Files\Storage\OwnCloud']=array( + 'backend' => 'ownCloud', + 'configuration' => array( + 'host' => 'URL', + 'user' => 'Username', + 'password' => '*Password', + 'root' => '&Remote subfolder', + 'secure' => '!Secure https://')); + } $backends['\OC\Files\Storage\SFTP']=array( 'backend' => 'SFTP', diff --git a/apps/files_external/lib/owncloud.php b/apps/files_external/lib/owncloud.php new file mode 100644 index 0000000000..98314102a6 --- /dev/null +++ b/apps/files_external/lib/owncloud.php @@ -0,0 +1,51 @@ + + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OC\Files\Storage; + +/** + * ownCloud backend for external storage based on DAV backend. + * + * The ownCloud URL consists of three parts: + * http://%host/%context/remote.php/webdav/%root + * + */ +class OwnCloud extends \OC\Files\Storage\DAV{ + const OC_URL_SUFFIX = 'remote.php/webdav'; + + public function __construct($params) { + // extract context path from host if specified + // (owncloud install path on host) + $host = $params['host']; + $contextPath = ''; + $hostSlashPos = strpos($host, '/'); + if ($hostSlashPos !== false){ + $contextPath = substr($host, $hostSlashPos); + $host = substr($host, 0, $hostSlashPos); + } + + if (substr($contextPath , 1) !== '/'){ + $contextPath .= '/'; + } + + if (isset($params['root'])){ + $root = $params['root']; + if (substr($root, 1) !== '/'){ + $root = '/' . $root; + } + } + else{ + $root = '/'; + } + + $params['host'] = $host; + $params['root'] = $contextPath . self::OC_URL_SUFFIX . $root; + + parent::__construct($params); + } +} diff --git a/apps/files_external/lib/webdav.php b/apps/files_external/lib/webdav.php index 66920fc9f6..5bdfe4d106 100644 --- a/apps/files_external/lib/webdav.php +++ b/apps/files_external/lib/webdav.php @@ -79,7 +79,7 @@ class DAV extends \OC\Files\Storage\Common{ return 'webdav::' . $this->user . '@' . $this->host . '/' . $this->root; } - private function createBaseUri() { + protected function createBaseUri() { $baseUri='http'; if ($this->secure) { $baseUri.='s'; diff --git a/apps/files_external/tests/config.php b/apps/files_external/tests/config.php index d4a69d29c0..a1651c08c8 100644 --- a/apps/files_external/tests/config.php +++ b/apps/files_external/tests/config.php @@ -23,6 +23,13 @@ return array( 'password'=>'test', 'root'=>'/owncloud/files/webdav.php', ), + 'owncloud'=>array( + 'run'=>true, + 'host'=>'localhost/owncloud', + 'user'=>'test', + 'password'=>'test', + 'root'=>'', + ), 'google'=>array( 'run'=> false, 'configured' => 'true', diff --git a/apps/files_external/tests/owncloud.php b/apps/files_external/tests/owncloud.php new file mode 100644 index 0000000000..408a55864f --- /dev/null +++ b/apps/files_external/tests/owncloud.php @@ -0,0 +1,31 @@ + + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace Test\Files\Storage; + +class OwnCloud extends Storage { + + private $config; + + public function setUp() { + $id = uniqid(); + $this->config = include('files_external/tests/config.php'); + if ( ! is_array($this->config) or ! isset($this->config['owncloud']) or ! $this->config['owncloud']['run']) { + $this->markTestSkipped('ownCloud backend not configured'); + } + $this->config['owncloud']['root'] .= '/' . $id; //make sure we have an new empty folder to work in + $this->instance = new \OC\Files\Storage\OwnCloud($this->config['owncloud']); + $this->instance->mkdir('/'); + } + + public function tearDown() { + if ($this->instance) { + $this->instance->rmdir('/'); + } + } +} From be0197a29ae6355f2be5e015faf50cfc16e304be Mon Sep 17 00:00:00 2001 From: zombiehugs Date: Wed, 4 Dec 2013 11:27:24 -0600 Subject: [PATCH 010/293] #6051 [ux][files] Move File Spinner Added spinner to file icon when moving to new folder or out of folder. Commit is related to #6051 --- apps/files/js/files.js | 42 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 37 insertions(+), 5 deletions(-) diff --git a/apps/files/js/files.js b/apps/files/js/files.js index fdaa3aa334..beda86d009 100644 --- a/apps/files/js/files.js +++ b/apps/files/js/files.js @@ -493,7 +493,7 @@ var createDragShadow = function(event) { var dir=$('#dir').val(); $(selectedFiles).each(function(i,elem) { - var newtr = $('').attr('data-dir', dir).attr('data-filename', elem.name); + var newtr = $('').attr('data-dir', dir).attr('data-filename', elem.name).attr('data-origin', elem.origin); newtr.append($('').addClass('filename').text(elem.name)); newtr.append($('').addClass('size').text(humanFileSize(elem.size))); tbody.append(newtr); @@ -511,13 +511,30 @@ var createDragShadow = function(event) { }; //options for file drag/drop +//start&stop handlers needs some cleaning up var dragOptions={ revert: 'invalid', revertDuration: 300, opacity: 0.7, zIndex: 100, appendTo: 'body', cursorAt: { left: 24, top: 18 }, helper: createDragShadow, cursor: 'move', - stop: function(event, ui) { - $('#fileList tr td.filename').addClass('ui-draggable'); - } + start: function(event, ui){ + var $selectedFiles = $('td.filename input:checkbox:checked'); + if($selectedFiles.length > 1){ + $selectedFiles.parents('tr').fadeTo(250, 0.2); + } + else{ + $(this).fadeTo(250, 0.2); + } + }, + stop: function(event, ui) { + var $selectedFiles = $('td.filename input:checkbox:checked'); + if($selectedFiles.length > 1){ + $selectedFiles.parents('tr').fadeTo(250, 1); + } + else{ + $(this).fadeTo(250, 1); + } + $('#fileList tr td.filename').addClass('ui-draggable'); + } }; // sane browsers support using the distance option if ( $('html.ie').length === 0) { @@ -525,6 +542,7 @@ if ( $('html.ie').length === 0) { } var folderDropOptions={ + hoverClass: "canDrop", drop: function( event, ui ) { //don't allow moving a file into a selected folder if ($(event.target).parents('tr').find('td input:first').prop('checked') === true) { @@ -537,6 +555,11 @@ var folderDropOptions={ $(files).each(function(i,row) { var dir = $(row).data('dir'); var file = $(row).data('filename'); + //slapdash selector, tracking down our original element that the clone budded off of. + var origin = $('tr[data-id=' + $(row).data('origin') + ']'); + var td = origin.children('td.filename'); + var oldBackgroundImage = td.css('background-image'); + td.css('background-image', 'url('+ OC.imagePath('core', 'loading.gif') + ')'); $.post(OC.filePath('files', 'ajax', 'move.php'), { dir: dir, file: file, target: dir+'/'+target }, function(result) { if (result) { if (result.status === 'success') { @@ -557,6 +580,7 @@ var folderDropOptions={ } else { OC.dialogs.alert(t('files', 'Error moving file'), t('files', 'Error')); } + td.css('background-image', oldBackgroundImage); }); }); }, @@ -581,6 +605,11 @@ var crumbDropOptions={ $(files).each(function(i,row) { var dir = $(row).data('dir'); var file = $(row).data('filename'); + //slapdash selector, tracking down our original element that the clone budded off of. + var origin = $('tr[data-id=' + $(row).data('origin') + ']'); + var td = origin.children('td.filename'); + var oldBackgroundImage = td.css('background-image'); + td.css('background-image', 'url('+ OC.imagePath('core', 'loading.gif') + ')'); $.post(OC.filePath('files', 'ajax', 'move.php'), { dir: dir, file: file, target: target }, function(result) { if (result) { if (result.status === 'success') { @@ -595,6 +624,7 @@ var crumbDropOptions={ } else { OC.dialogs.alert(t('files', 'Error moving file'), t('files', 'Error')); } + td.css('background-image', oldBackgroundImage); }); }); }, @@ -660,7 +690,8 @@ function getSelectedFilesTrash(property) { mime:$(element).data('mime'), type:$(element).data('type'), size:$(element).data('size'), - etag:$(element).data('etag') + etag:$(element).data('etag'), + origin: $(element).data('id') }; if (property) { files.push(file[property]); @@ -780,3 +811,4 @@ function onClickBreadcrumb(e) { FileList.changeDirectory(decodeURIComponent($targetDir)); } } + From 8fb4ab097dd7cd8ae1ab8fc15ae48021f8d9c28e Mon Sep 17 00:00:00 2001 From: zombiehugs Date: Wed, 4 Dec 2013 12:30:06 -0600 Subject: [PATCH 011/293] Fixed indention. As per @kabum request, indention on line 694 has been fixed. --- 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 beda86d009..89334070fc 100644 --- a/apps/files/js/files.js +++ b/apps/files/js/files.js @@ -691,7 +691,7 @@ function getSelectedFilesTrash(property) { type:$(element).data('type'), size:$(element).data('size'), etag:$(element).data('etag'), - origin: $(element).data('id') + origin: $(element).data('id') }; if (property) { files.push(file[property]); From e13be94e56ec59d92b6c9cf67b7a17bd03438efb Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Fri, 6 Dec 2013 17:23:51 +0100 Subject: [PATCH 012/293] Fixed Dropbox/Google storage async save call When clicking "Grant access", the settings for Dropbox/Google were saved through a call that gets cancelled when redirecting to the grant page (for example in Firefox) This fix makes sure the "save settings" call finished before redirecting to the grant page. Fixes #6176 --- apps/files_external/js/dropbox.js | 17 +++++++++-------- apps/files_external/js/google.js | 21 +++++++++++---------- apps/files_external/js/settings.js | 14 +++++++++++++- 3 files changed, 33 insertions(+), 19 deletions(-) diff --git a/apps/files_external/js/dropbox.js b/apps/files_external/js/dropbox.js index 957daeb4d1..6baaabe11b 100644 --- a/apps/files_external/js/dropbox.js +++ b/apps/files_external/js/dropbox.js @@ -23,9 +23,12 @@ $(document).ready(function() { $(token).val(result.access_token); $(token_secret).val(result.access_token_secret); $(configured).val('true'); - OC.MountConfig.saveStorage(tr); - $(tr).find('.configuration input').attr('disabled', 'disabled'); - $(tr).find('.configuration').append(''+t('files_external', 'Access granted')+''); + OC.MountConfig.saveStorage(tr, function(status) { + if (status) { + $(tr).find('.configuration input').attr('disabled', 'disabled'); + $(tr).find('.configuration').append(''+t('files_external', 'Access granted')+''); + } + }); } else { OC.dialogs.alert(result.data.message, t('files_external', 'Error configuring Dropbox storage')); } @@ -77,7 +80,6 @@ $(document).ready(function() { var tr = $(this).parent().parent(); var app_key = $(this).parent().find('[data-parameter="app_key"]').val(); var app_secret = $(this).parent().find('[data-parameter="app_secret"]').val(); - var statusSpan = $(tr).find('.status span'); if (app_key != '' && app_secret != '') { var tr = $(this).parent().parent(); var configured = $(this).parent().find('[data-parameter="configured"]'); @@ -88,10 +90,9 @@ $(document).ready(function() { $(configured).val('false'); $(token).val(result.data.request_token); $(token_secret).val(result.data.request_token_secret); - OC.MountConfig.saveStorage(tr); - statusSpan.removeClass(); - statusSpan.addClass('waiting'); - window.location = result.data.url; + OC.MountConfig.saveStorage(tr, function() { + window.location = result.data.url; + }); } else { OC.dialogs.alert(result.data.message, t('files_external', 'Error configuring Dropbox storage')); } diff --git a/apps/files_external/js/google.js b/apps/files_external/js/google.js index b4be1c1dc4..068c2c13c6 100644 --- a/apps/files_external/js/google.js +++ b/apps/files_external/js/google.js @@ -32,11 +32,14 @@ $(document).ready(function() { if (result && result.status == 'success') { $(token).val(result.data.token); $(configured).val('true'); - OC.MountConfig.saveStorage(tr); - $(tr).find('.configuration input').attr('disabled', 'disabled'); - $(tr).find('.configuration').append($('') - .attr('id', 'access') - .text(t('files_external', 'Access granted'))); + OC.MountConfig.saveStorage(tr, function(status) { + if (status) { + $(tr).find('.configuration input').attr('disabled', 'disabled'); + $(tr).find('.configuration').append($('') + .attr('id', 'access') + .text(t('files_external', 'Access granted'))); + } + }); } else { OC.dialogs.alert(result.data.message, t('files_external', 'Error configuring Google Drive storage') @@ -99,7 +102,6 @@ $(document).ready(function() { var configured = $(this).parent().find('[data-parameter="configured"]'); var client_id = $(this).parent().find('[data-parameter="client_id"]').val(); var client_secret = $(this).parent().find('[data-parameter="client_secret"]').val(); - var statusSpan = $(tr).find('.status span'); if (client_id != '' && client_secret != '') { var token = $(this).parent().find('[data-parameter="token"]'); $.post(OC.filePath('files_external', 'ajax', 'google.php'), @@ -112,10 +114,9 @@ $(document).ready(function() { if (result && result.status == 'success') { $(configured).val('false'); $(token).val('false'); - OC.MountConfig.saveStorage(tr); - statusSpan.removeClass(); - statusSpan.addClass('waiting'); - window.location = result.data.url; + OC.MountConfig.saveStorage(tr, function(status) { + window.location = result.data.url; + }); } else { OC.dialogs.alert(result.data.message, t('files_external', 'Error configuring Google Drive storage') diff --git a/apps/files_external/js/settings.js b/apps/files_external/js/settings.js index 886c324e33..895f97bd2c 100644 --- a/apps/files_external/js/settings.js +++ b/apps/files_external/js/settings.js @@ -12,7 +12,7 @@ function updateStatus(statusEl, result){ } OC.MountConfig={ - saveStorage:function(tr) { + saveStorage:function(tr, callback) { var mountPoint = $(tr).find('.mountPoint input').val(); if (mountPoint == '') { return false; @@ -84,9 +84,15 @@ OC.MountConfig={ }, success: function(result) { status = updateStatus(statusSpan, result); + if (callback) { + callback(status); + } }, error: function(result){ status = updateStatus(statusSpan, result); + if (callback) { + callback(status); + } } }); }); @@ -137,9 +143,15 @@ OC.MountConfig={ }, success: function(result) { status = updateStatus(statusSpan, result); + if (callback) { + callback(status); + } }, error: function(result){ status = updateStatus(statusSpan, result); + if (callback) { + callback(status); + } } }); } From 44a55056e7b6dc505af7f8a0a6f7b33bd0dcacb8 Mon Sep 17 00:00:00 2001 From: Morris Jobke Date: Sat, 7 Dec 2013 17:33:27 +0100 Subject: [PATCH 013/293] change mail address by pressing enter - fixes #6179 --- settings/js/personal.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/settings/js/personal.js b/settings/js/personal.js index 2934677f25..7b9268ca81 100644 --- a/settings/js/personal.js +++ b/settings/js/personal.js @@ -171,6 +171,18 @@ $(document).ready(function(){ } }); + $('#email').keypress(function(event){ + // check for enter key and non empyt email + if (event.keyCode === 13 && $('#email').val() !== '' ){ + event.preventDefault() + // clear timeout of previous keyup event - prevents duplicate changeEmailAddress call + if(typeof timeout !== 'undefined'){ + clearTimeout(timeout); + } + changeEmailAddress(); + } + }); + $("#languageinput").change( function(){ // Serialize the data var post = $( "#languageinput" ).serialize(); From 69f2bde324cd491937a90948a23b06a06c2f2400 Mon Sep 17 00:00:00 2001 From: Pellaeon Lin Date: Sun, 8 Dec 2013 15:41:20 +0800 Subject: [PATCH 014/293] Change misleading message when file size exceeds upload limit --- apps/files/js/file-upload.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/files/js/file-upload.js b/apps/files/js/file-upload.js index e9663353f7..979bb74b13 100644 --- a/apps/files/js/file-upload.js +++ b/apps/files/js/file-upload.js @@ -235,8 +235,8 @@ $(document).ready(function() { //check max upload size if (selection.totalBytes > $('#max_upload').val()) { - data.textStatus = 'notenoughspace'; - data.errorThrown = t('files', 'Not enough space available'); + data.textStatus = 'sizeexceedlimit'; + data.errorThrown = t('files', 'File size exceeds upload limit'); } // end upload for whole selection on error From fc607e6bce76e9e2f6f52421bdddece951f629cd Mon Sep 17 00:00:00 2001 From: Pellaeon Lin Date: Sun, 8 Dec 2013 22:59:46 +0800 Subject: [PATCH 015/293] Separate PHP upload limit and free space --- lib/private/helper.php | 42 +++++++++++++++++++++++++++++------------- lib/public/util.php | 19 +++++++++++++++++++ 2 files changed, 48 insertions(+), 13 deletions(-) diff --git a/lib/private/helper.php b/lib/private/helper.php index c82d3bd4ef..0bef427c6c 100644 --- a/lib/private/helper.php +++ b/lib/private/helper.php @@ -828,23 +828,39 @@ class OC_Helper { * @return number of bytes representing */ public static function maxUploadFilesize($dir) { - $upload_max_filesize = OCP\Util::computerFileSize(ini_get('upload_max_filesize')); - $post_max_size = OCP\Util::computerFileSize(ini_get('post_max_size')); - $freeSpace = \OC\Files\Filesystem::free_space($dir); - if ((int)$upload_max_filesize === 0 and (int)$post_max_size === 0) { - $maxUploadFilesize = \OC\Files\SPACE_UNLIMITED; - } elseif ((int)$upload_max_filesize === 0 or (int)$post_max_size === 0) { - $maxUploadFilesize = max($upload_max_filesize, $post_max_size); //only the non 0 value counts - } else { - $maxUploadFilesize = min($upload_max_filesize, $post_max_size); - } + return min(self::freeSpace($dir), self::uploadLimit()); + } + /** + * Calculate free space left within user quota + * + * @param $dir the current folder where the user currently operates + * @return number of bytes representing + */ + public static function freeSpace($dir) { + $freeSpace = \OC\Files\Filesystem::free_space($dir); if ($freeSpace !== \OC\Files\SPACE_UNKNOWN) { $freeSpace = max($freeSpace, 0); - - return min($maxUploadFilesize, $freeSpace); + return $freeSpace; } else { - return $maxUploadFilesize; + return INF; + } + } + + /** + * Calculate PHP upload limit + * + * @return PHP upload file size limit + */ + public static function uploadLimit() { + $upload_max_filesize = OCP\Util::computerFileSize(ini_get('upload_max_filesize')); + $post_max_size = OCP\Util::computerFileSize(ini_get('post_max_size')); + if ((int)$upload_max_filesize === 0 and (int)$post_max_size === 0) { + return INF; + } elseif ((int)$upload_max_filesize === 0 or (int)$post_max_size === 0) { + return max($upload_max_filesize, $post_max_size); //only the non 0 value counts + } else { + return min($upload_max_filesize, $post_max_size); } } diff --git a/lib/public/util.php b/lib/public/util.php index 1d76fd1e1f..cf7ac63ba5 100644 --- a/lib/public/util.php +++ b/lib/public/util.php @@ -458,4 +458,23 @@ class Util { public static function maxUploadFilesize($dir) { return \OC_Helper::maxUploadFilesize($dir); } + + /** + * Calculate free space left within user quota + * + * @param $dir the current folder where the user currently operates + * @return number of bytes representing + */ + public static function freeSpace($dir) { + return \OC_Helper::freeSpace($dir); + } + + /** + * Calculate PHP upload limit + * + * @return number of bytes representing + */ + public static function uploadLimit() { + return \OC_Helper::uploadLimit(); + } } From 64bf0fa47fe4c623672cf86e831f66974e7f650c Mon Sep 17 00:00:00 2001 From: Pellaeon Lin Date: Sun, 8 Dec 2013 23:17:35 +0800 Subject: [PATCH 016/293] Display different messages for uploadLimit and freeSpace --- apps/files/index.php | 4 ++++ apps/files/js/file-upload.js | 10 ++++++++-- apps/files/templates/index.php | 5 +++-- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/apps/files/index.php b/apps/files/index.php index 8f6838aa0d..4ea0f9f249 100644 --- a/apps/files/index.php +++ b/apps/files/index.php @@ -103,6 +103,8 @@ if ($needUpgrade) { } else { // information about storage capacities $storageInfo=OC_Helper::getStorageInfo($dir); + $freeSpace=OCP\Util::freeSpace($dir); + $uploadLimit=OCP\Util::uploadLimit(); $maxUploadFilesize=OCP\Util::maxUploadFilesize($dir); $publicUploadEnabled = \OC_Appconfig::getValue('core', 'shareapi_allow_public_upload', 'yes'); // if the encryption app is disabled, than everything is fine (INIT_SUCCESSFUL status code) @@ -136,6 +138,8 @@ if ($needUpgrade) { $tmpl->assign('trashEmpty', $trashEmpty); $tmpl->assign('uploadMaxFilesize', $maxUploadFilesize); $tmpl->assign('uploadMaxHumanFilesize', OCP\Util::humanFileSize($maxUploadFilesize)); + $tmpl->assign('freeSpace', $freeSpace); + $tmpl->assign('uploadLimit', $uploadLimit); $tmpl->assign('allowZipDownload', intval(OCP\Config::getSystemValue('allowZipDownload', true))); $tmpl->assign('usedSpacePercent', (int)$storageInfo['relative']); $tmpl->assign('isPublic', false); diff --git a/apps/files/js/file-upload.js b/apps/files/js/file-upload.js index 979bb74b13..7bd0eb81f5 100644 --- a/apps/files/js/file-upload.js +++ b/apps/files/js/file-upload.js @@ -233,11 +233,17 @@ $(document).ready(function() { // add size selection.totalBytes += file.size; - //check max upload size - if (selection.totalBytes > $('#max_upload').val()) { + // check PHP upload limit + if (selection.totalBytes > $('#upload_limit').val()) { data.textStatus = 'sizeexceedlimit'; data.errorThrown = t('files', 'File size exceeds upload limit'); } + + // check free space + if (selection.totalBytes > $('#free_space').val()) { + data.textStatus = 'notenoughspace'; + data.errorThrown = t('files', 'Not enough free space'); + } // end upload for whole selection on error if (data.errorThrown) { diff --git a/apps/files/templates/index.php b/apps/files/templates/index.php index 00ec109621..3d8a7f78e4 100644 --- a/apps/files/templates/index.php +++ b/apps/files/templates/index.php @@ -15,9 +15,10 @@
= 0):?> - + + + From bc23f46198168c80cc1aab3ae386687b4ce1ec49 Mon Sep 17 00:00:00 2001 From: Morris Jobke Date: Mon, 9 Dec 2013 16:05:10 +0100 Subject: [PATCH 017/293] fix typo --- settings/js/personal.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings/js/personal.js b/settings/js/personal.js index 7b9268ca81..010f0fc0a7 100644 --- a/settings/js/personal.js +++ b/settings/js/personal.js @@ -172,7 +172,7 @@ $(document).ready(function(){ }); $('#email').keypress(function(event){ - // check for enter key and non empyt email + // check for enter key and non empty email if (event.keyCode === 13 && $('#email').val() !== '' ){ event.preventDefault() // clear timeout of previous keyup event - prevents duplicate changeEmailAddress call From 409b5108896edda9adf916cd566dbce2d2b00351 Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Tue, 10 Dec 2013 12:05:39 +0100 Subject: [PATCH 018/293] Moved content disposition code+workarounds to OCP\Response Added new OC\Response API called setContentDispositionHeader() that contains the needed workarounds for UTF8 and IE. Refactored download code to use the new API. Removed unused trashbin download file. --- apps/files/download.php | 7 +---- apps/files_trashbin/download.php | 51 -------------------------------- apps/files_versions/download.php | 7 +---- lib/private/files.php | 7 +---- lib/private/response.php | 14 +++++++++ lib/public/response.php | 9 ++++++ 6 files changed, 26 insertions(+), 69 deletions(-) delete mode 100644 apps/files_trashbin/download.php diff --git a/apps/files/download.php b/apps/files/download.php index e3fe24e45d..6b055e99a5 100644 --- a/apps/files/download.php +++ b/apps/files/download.php @@ -37,12 +37,7 @@ if(!\OC\Files\Filesystem::file_exists($filename)) { $ftype=\OC\Files\Filesystem::getMimeType( $filename ); header('Content-Type:'.$ftype); -if ( preg_match( "/MSIE/", $_SERVER["HTTP_USER_AGENT"] ) ) { - header( 'Content-Disposition: attachment; filename="' . rawurlencode( basename($filename) ) . '"' ); -} else { - header( 'Content-Disposition: attachment; filename*=UTF-8\'\'' . rawurlencode( basename($filename) ) - . '; filename="' . rawurlencode( basename($filename) ) . '"' ); -} +OCP\Response::setContentDispositionHeader(basename($filename), 'attachment'); OCP\Response::disableCaching(); header('Content-Length: '.\OC\Files\Filesystem::filesize($filename)); diff --git a/apps/files_trashbin/download.php b/apps/files_trashbin/download.php deleted file mode 100644 index 60328e1ddd..0000000000 --- a/apps/files_trashbin/download.php +++ /dev/null @@ -1,51 +0,0 @@ -. -* -*/ - -// Check if we are a user -OCP\User::checkLoggedIn(); - -$filename = $_GET["file"]; - -$view = new OC_FilesystemView('/'.\OCP\User::getUser().'/files_trashbin/files'); - -if(!$view->file_exists($filename)) { - header("HTTP/1.0 404 Not Found"); - $tmpl = new OCP\Template( '', '404', 'guest' ); - $tmpl->assign('file', $filename); - $tmpl->printPage(); - exit; -} - -$ftype=$view->getMimeType( $filename ); - -header('Content-Type:'.$ftype);if ( preg_match( "/MSIE/", $_SERVER["HTTP_USER_AGENT"] ) ) { - header( 'Content-Disposition: attachment; filename="' . rawurlencode( basename($filename) ) . '"' ); -} else { - header( 'Content-Disposition: attachment; filename*=UTF-8\'\'' . rawurlencode( basename($filename) ) - . '; filename="' . rawurlencode( basename($filename) ) . '"' ); -} -OCP\Response::disableCaching(); -header('Content-Length: '. $view->filesize($filename)); - -OC_Util::obEnd(); -$view->readfile( $filename ); diff --git a/apps/files_versions/download.php b/apps/files_versions/download.php index 040a662e61..2fe56d2e63 100644 --- a/apps/files_versions/download.php +++ b/apps/files_versions/download.php @@ -36,12 +36,7 @@ $view = new OC\Files\View('/'); $ftype = $view->getMimeType('/'.$uid.'/files/'.$filename); header('Content-Type:'.$ftype); -if ( preg_match( "/MSIE/", $_SERVER["HTTP_USER_AGENT"] ) ) { - header( 'Content-Disposition: attachment; filename="' . rawurlencode( basename($filename) ) . '"' ); -} else { - header( 'Content-Disposition: attachment; filename*=UTF-8\'\'' . rawurlencode( basename($filename) ) - . '; filename="' . rawurlencode( basename($filename) ) . '"' ); -} +OCP\Response::setContentDispositionHeader(basename($filename), 'attachment'); OCP\Response::disableCaching(); header('Content-Length: '.$view->filesize($versionName)); diff --git a/lib/private/files.php b/lib/private/files.php index 6ffa14c0d9..e6c81d58bd 100644 --- a/lib/private/files.php +++ b/lib/private/files.php @@ -115,12 +115,7 @@ class OC_Files { } OC_Util::obEnd(); if ($zip or \OC\Files\Filesystem::isReadable($filename)) { - if ( preg_match( "/MSIE/", $_SERVER["HTTP_USER_AGENT"] ) ) { - header( 'Content-Disposition: attachment; filename="' . rawurlencode($name) . '"' ); - } else { - header( 'Content-Disposition: attachment; filename*=UTF-8\'\'' . rawurlencode($name) - . '; filename="' . rawurlencode($name) . '"' ); - } + OC_Response::setContentDispositionHeader($name, 'attachment'); header('Content-Transfer-Encoding: binary'); OC_Response::disableCaching(); if ($zip) { diff --git a/lib/private/response.php b/lib/private/response.php index 674176d078..1b9cb473d6 100644 --- a/lib/private/response.php +++ b/lib/private/response.php @@ -147,6 +147,20 @@ class OC_Response { header('Last-Modified: '.$lastModified); } + /** + * Sets the content disposition header (with possible workarounds) + * @param string $filename file name + * @param string $type disposition type, either 'attachment' or 'inline' + */ + static public function setContentDispositionHeader( $filename, $type = 'attachment' ) { + if ( preg_match( "/MSIE/", $_SERVER["HTTP_USER_AGENT"] ) ) { + header( 'Content-Disposition: ' . rawurlencode($type) . '; filename="' . rawurlencode( $filename ) . '"' ); + } else { + header( 'Content-Disposition: ' . rawurlencode($type) . '; filename*=UTF-8\'\'' . rawurlencode( $filename ) + . '; filename="' . rawurlencode( $filename ) . '"' ); + } + } + /** * @brief Send file as response, checking and setting caching headers * @param $filepath of file to send diff --git a/lib/public/response.php b/lib/public/response.php index 2ca0a0c9fa..24d3c81d62 100644 --- a/lib/public/response.php +++ b/lib/public/response.php @@ -54,6 +54,15 @@ class Response { \OC_Response::setLastModifiedHeader( $lastModified ); } + /** + * Sets the content disposition header (with possible workarounds) + * @param string $filename file name + * @param string $type disposition type, either 'attachment' or 'inline' + */ + static public function setContentDispositionHeader( $filename, $type = 'attachment' ) { + \OC_Response::setContentDispositionHeader( $filename, $type ); + } + /** * Disable browser caching * @see enableCaching with cache_time = 0 From 82bf1f9c8ccbfed39790d22b2fbea2c5286122dc Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Tue, 10 Dec 2013 12:40:59 +0100 Subject: [PATCH 019/293] Added workaround for Android content disposition Fixes #5807 --- lib/private/response.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/private/response.php b/lib/private/response.php index 1b9cb473d6..c6edda0f94 100644 --- a/lib/private/response.php +++ b/lib/private/response.php @@ -153,7 +153,8 @@ class OC_Response { * @param string $type disposition type, either 'attachment' or 'inline' */ static public function setContentDispositionHeader( $filename, $type = 'attachment' ) { - if ( preg_match( "/MSIE/", $_SERVER["HTTP_USER_AGENT"] ) ) { + // Android Chrome user agent: https://developers.google.com/chrome/mobile/docs/user-agent + if ( preg_match( '/MSIE/', $_SERVER['HTTP_USER_AGENT'] ) or preg_match( '#Android.*Chrome/[.0-9]*#', $_SERVER['HTTP_USER_AGENT'] ) ) { header( 'Content-Disposition: ' . rawurlencode($type) . '; filename="' . rawurlencode( $filename ) . '"' ); } else { header( 'Content-Disposition: ' . rawurlencode($type) . '; filename*=UTF-8\'\'' . rawurlencode( $filename ) From 0aa38165a4659fedd98f752bdd99bf174ed98a76 Mon Sep 17 00:00:00 2001 From: Pellaeon Lin Date: Wed, 11 Dec 2013 12:17:28 +0800 Subject: [PATCH 020/293] Update #free_space on getstoragestats AJAX call --- apps/files/js/files.js | 1 + apps/files/lib/helper.php | 2 ++ 2 files changed, 3 insertions(+) diff --git a/apps/files/js/files.js b/apps/files/js/files.js index fdaa3aa334..0a2f1aef01 100644 --- a/apps/files/js/files.js +++ b/apps/files/js/files.js @@ -41,6 +41,7 @@ Files={ } if (response.data !== undefined && response.data.uploadMaxFilesize !== undefined) { $('#max_upload').val(response.data.uploadMaxFilesize); + $('#free_space').val(response.data.freeSpace); $('#upload.button').attr('original-title', response.data.maxHumanFilesize); $('#usedSpacePercent').val(response.data.usedSpacePercent); Files.displayStorageWarnings(); diff --git a/apps/files/lib/helper.php b/apps/files/lib/helper.php index eaff28178e..2f4a979066 100644 --- a/apps/files/lib/helper.php +++ b/apps/files/lib/helper.php @@ -6,6 +6,7 @@ class Helper { public static function buildFileStorageStatistics($dir) { $l = new \OC_L10N('files'); + $freeSpace=OCP\Util::freeSpace($dir); $maxUploadFilesize = \OCP\Util::maxUploadFilesize($dir); $maxHumanFilesize = \OCP\Util::humanFileSize($maxUploadFilesize); $maxHumanFilesize = $l->t('Upload') . ' max. ' . $maxHumanFilesize; @@ -15,6 +16,7 @@ class Helper return array('uploadMaxFilesize' => $maxUploadFilesize, 'maxHumanFilesize' => $maxHumanFilesize, + 'freeSpace' => $freeSpace, 'usedSpacePercent' => (int)$storageInfo['relative']); } From 4b081be9569ed831c8f0fb7448bf798f004b8816 Mon Sep 17 00:00:00 2001 From: Pellaeon Lin Date: Wed, 11 Dec 2013 12:09:48 +0800 Subject: [PATCH 021/293] #max_upload is needed after all --- apps/files/templates/index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/files/templates/index.php b/apps/files/templates/index.php index 3d8a7f78e4..f20a3f1d07 100644 --- a/apps/files/templates/index.php +++ b/apps/files/templates/index.php @@ -15,7 +15,7 @@
= 0):?> - + From 5ddd85ff9cb64c10974804e810f8f68f275114a3 Mon Sep 17 00:00:00 2001 From: Pellaeon Lin Date: Wed, 11 Dec 2013 15:40:58 +0800 Subject: [PATCH 022/293] Contextual upload error message --- apps/files/js/file-upload.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/files/js/file-upload.js b/apps/files/js/file-upload.js index 7bd0eb81f5..1a36a58053 100644 --- a/apps/files/js/file-upload.js +++ b/apps/files/js/file-upload.js @@ -236,13 +236,13 @@ $(document).ready(function() { // check PHP upload limit if (selection.totalBytes > $('#upload_limit').val()) { data.textStatus = 'sizeexceedlimit'; - data.errorThrown = t('files', 'File size exceeds upload limit'); + data.errorThrown = t('files', 'Total file size {size1} exceeds upload limit {size2}').replace('{size1}', humanFileSize(selection.totalBytes)).replace('{size2}', humanFileSize($('#upload_limit').val())); } // check free space if (selection.totalBytes > $('#free_space').val()) { data.textStatus = 'notenoughspace'; - data.errorThrown = t('files', 'Not enough free space'); + data.errorThrown = t('files', 'Not enough free space, you are uploading {size1} but only {size2} is left').replace('{size1}', humanFileSize(selection.totalBytes)).replace('{size2}', humanFileSize($('#free_space').val())); } // end upload for whole selection on error From 7c264c88fe06c61ef602fa8a241428c99f220061 Mon Sep 17 00:00:00 2001 From: Carlos Cerrillo Date: Sun, 15 Dec 2013 17:22:52 +0100 Subject: [PATCH 023/293] Fixing Issue #6301 on master branch Added private var $certPath to store the user root cert Move logic to determine the $certPath path to the constructor and modify to get the path from OC_User::getHome() Add curl options to use the certificate to avoid certificate errors with self-signed certicates in the downdload/upload method so we don't get blank files --- apps/files_external/lib/webdav.php | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/apps/files_external/lib/webdav.php b/apps/files_external/lib/webdav.php index 02f6cb5fc4..2308c7873b 100644 --- a/apps/files_external/lib/webdav.php +++ b/apps/files_external/lib/webdav.php @@ -14,6 +14,7 @@ class DAV extends \OC\Files\Storage\Common{ private $host; private $secure; private $root; + private $certPath; private $ready; /** * @var \Sabre_DAV_Client @@ -40,6 +41,12 @@ class DAV extends \OC\Files\Storage\Common{ } else { $this->secure = false; } + if ($this->secure === true) { + $certPath=\OC_User::getHome(\OC_User::getUser()) . '/files_external/rootcerts.crt'; + if (file_exists($certPath)) { + $this->certPath=$certPath; + } + } $this->root=isset($params['root'])?$params['root']:'/'; if ( ! $this->root || $this->root[0]!='/') { $this->root='/'.$this->root; @@ -66,12 +73,8 @@ class DAV extends \OC\Files\Storage\Common{ $this->client = new \Sabre_DAV_Client($settings); - $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); - } + if ($this->certPath) { + $this->client->addTrustedCertificates($this->certPath); } } @@ -166,6 +169,11 @@ class DAV extends \OC\Files\Storage\Common{ curl_setopt($curl, CURLOPT_URL, $this->createBaseUri().str_replace(' ', '%20', $path)); curl_setopt($curl, CURLOPT_FILE, $fp); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true); + curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2); + if($this->certPath){ + curl_setopt($curl, CURLOPT_CAINFO, $this->certPath); + } curl_exec ($curl); curl_close ($curl); @@ -254,6 +262,11 @@ class DAV extends \OC\Files\Storage\Common{ curl_setopt($curl, CURLOPT_INFILE, $source); // file pointer curl_setopt($curl, CURLOPT_INFILESIZE, filesize($path)); curl_setopt($curl, CURLOPT_PUT, true); + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true); + curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2); + if($this->certPath){ + curl_setopt($curl, CURLOPT_CAINFO, $this->certPath); + } curl_exec ($curl); curl_close ($curl); } @@ -331,3 +344,4 @@ class DAV extends \OC\Files\Storage\Common{ } } } + From 059c3c8708c9b94df80d43ab8cac0cfc9b867cb8 Mon Sep 17 00:00:00 2001 From: Georg Ehrke Date: Mon, 16 Dec 2013 15:38:12 +0100 Subject: [PATCH 024/293] fix issue with logging non utf8 chars --- lib/private/image.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/private/image.php b/lib/private/image.php index 7761a3c773..314a4216b8 100644 --- a/lib/private/image.php +++ b/lib/private/image.php @@ -416,7 +416,7 @@ class OC_Image { // exif_imagetype throws "read error!" if file is less than 12 byte if(!@is_file($imagePath) || !file_exists($imagePath) || filesize($imagePath) < 12 || !is_readable($imagePath)) { // Debug output disabled because this method is tried before loadFromBase64? - OC_Log::write('core', 'OC_Image->loadFromFile, couldn\'t load: '.$imagePath, OC_Log::DEBUG); + OC_Log::write('core', 'OC_Image->loadFromFile, couldn\'t load: ' . (string) $imagePath, OC_Log::DEBUG); return false; } $iType = exif_imagetype($imagePath); From b245e2e3d86299092448e3223b0d658d88206873 Mon Sep 17 00:00:00 2001 From: Carlos Cerrillo Date: Tue, 17 Dec 2013 09:38:43 +0100 Subject: [PATCH 025/293] Fixing tab/space coding style Only set SSL things when ```$this->secure``` is ```true``` --- apps/files_external/lib/webdav.php | 38 +++++++++++++++++------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/apps/files_external/lib/webdav.php b/apps/files_external/lib/webdav.php index 2308c7873b..9d56be8472 100644 --- a/apps/files_external/lib/webdav.php +++ b/apps/files_external/lib/webdav.php @@ -65,15 +65,15 @@ class DAV extends \OC\Files\Storage\Common{ } $this->ready = true; - $settings = array( - 'baseUri' => $this->createBaseUri(), - 'userName' => $this->user, - 'password' => $this->password, - ); + $settings = array( + 'baseUri' => $this->createBaseUri(), + 'userName' => $this->user, + 'password' => $this->password, + ); $this->client = new \Sabre_DAV_Client($settings); - if ($this->certPath) { + if ($this->secure === true && $this->certPath) { $this->client->addTrustedCertificates($this->certPath); } } @@ -169,12 +169,14 @@ class DAV extends \OC\Files\Storage\Common{ curl_setopt($curl, CURLOPT_URL, $this->createBaseUri().str_replace(' ', '%20', $path)); curl_setopt($curl, CURLOPT_FILE, $fp); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); - curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true); - curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2); - if($this->certPath){ - curl_setopt($curl, CURLOPT_CAINFO, $this->certPath); - } - + if ($this->secure === true) { + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true); + curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2); + if($this->certPath){ + curl_setopt($curl, CURLOPT_CAINFO, $this->certPath); + } + } + curl_exec ($curl); curl_close ($curl); rewind($fp); @@ -262,11 +264,13 @@ class DAV extends \OC\Files\Storage\Common{ curl_setopt($curl, CURLOPT_INFILE, $source); // file pointer curl_setopt($curl, CURLOPT_INFILESIZE, filesize($path)); curl_setopt($curl, CURLOPT_PUT, true); - curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true); - curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2); - if($this->certPath){ - curl_setopt($curl, CURLOPT_CAINFO, $this->certPath); - } + if ($this->secure === true) { + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true); + curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2); + if($this->certPath){ + curl_setopt($curl, CURLOPT_CAINFO, $this->certPath); + } + } curl_exec ($curl); curl_close ($curl); } From c06844c374c145b2f05ae0800678f68acc9ae2e3 Mon Sep 17 00:00:00 2001 From: Carlos Cerrillo Date: Tue, 17 Dec 2013 10:13:14 +0100 Subject: [PATCH 026/293] Fix ```createCertificateBundle``` and ```getCertificates``` methods from ```OC_Mount_config``` to use ```OC_User::getHome``` to get the path --- apps/files_external/lib/config.php | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/apps/files_external/lib/config.php b/apps/files_external/lib/config.php index 12836c7b88..373246a429 100755 --- a/apps/files_external/lib/config.php +++ b/apps/files_external/lib/config.php @@ -382,8 +382,7 @@ class OC_Mount_Config { * @return array */ public static function getCertificates() { - $view = \OCP\Files::getStorage('files_external'); - $path=\OCP\Config::getSystemValue('datadirectory').$view->getAbsolutePath("").'uploads/'; + $path=OC_User::getHome(OC_User::getUser()) . '/files_external/uploads/'; \OCP\Util::writeLog('files_external', 'checking path '.$path, \OCP\Util::INFO); if ( ! is_dir($path)) { //path might not exist (e.g. non-standard OC_User::getHome() value) @@ -405,8 +404,7 @@ class OC_Mount_Config { * creates certificate bundle */ public static function createCertificateBundle() { - $view = \OCP\Files::getStorage("files_external"); - $path = \OCP\Config::getSystemValue('datadirectory').$view->getAbsolutePath(""); + $path=OC_User::getHome(OC_User::getUser()) . '/files_external'; $certs = OC_Mount_Config::getCertificates(); $fh_certs = fopen($path."/rootcerts.crt", 'w'); From 3c21fd5bfcaedf05a6028a4585f56e4afaddf33a Mon Sep 17 00:00:00 2001 From: Jan-Christoph Borchardt Date: Wed, 18 Dec 2013 14:59:57 +0100 Subject: [PATCH 027/293] do not show 'Add app' and 'More apps' for themed ownCloud --- settings/templates/apps.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/settings/templates/apps.php b/settings/templates/apps.php index 0b76f775fe..bf2f178ca1 100644 --- a/settings/templates/apps.php +++ b/settings/templates/apps.php @@ -9,9 +9,11 @@
From 51e1bd5d040b37056c0baf028497a20fa74d84b2 Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Thu, 19 Dec 2013 16:47:17 +0100 Subject: [PATCH 028/293] Enforce required phpunit version This will prevent frustration and confusion when unit tests fail because the wrong phpunit version was used --- autotest.sh | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/autotest.sh b/autotest.sh index 3562b0feb0..94fc692a94 100755 --- a/autotest.sh +++ b/autotest.sh @@ -13,6 +13,7 @@ ADMINLOGIN=admin$EXECUTOR_NUMBER BASEDIR=$PWD DBCONFIGS="sqlite mysql pgsql oci" +PHPUNIT=$(which phpunit) function print_syntax { echo -e "Syntax: ./autotest.sh [dbconfigname] [testfile]\n" >&2 @@ -23,6 +24,20 @@ function print_syntax { echo -e "\nIf no arguments are specified, all tests will be run with all database configs" >&2 } +if ! [ -x $PHPUNIT ]; then + echo "phpunit executable not found, please install phpunit version >= 3.7" >&2 + exit 3 +fi + +PHPUNIT_VERSION=$($PHPUNIT --version | cut -d" " -f2) +PHPUNIT_MAJOR_VERSION=$(echo $PHPUNIT_VERSION | cut -d"." -f1) +PHPUNIT_MINOR_VERSION=$(echo $PHPUNIT_VERSION | cut -d"." -f2) + +if ! [ $PHPUNIT_MAJOR_VERSION -gt 3 -o \( $PHPUNIT_MAJOR_VERSION -eq 3 -a $PHPUNIT_MINOR_VERSION -ge 7 \) ]; then + echo "phpunit version >= 3.7 required. Version found: $PHPUNIT_VERSION" >&2 + exit 4 +fi + if ! [ -w config -a -w config/config.php ]; then echo "Please enable write permissions on config and config/config.php" >&2 exit 1 @@ -179,10 +194,10 @@ EOF mkdir coverage-html-$1 php -f enable_all.php if [ -z "$NOCOVERAGE" ]; then - phpunit --configuration phpunit-autotest.xml --log-junit autotest-results-$1.xml --coverage-clover autotest-clover-$1.xml --coverage-html coverage-html-$1 $2 $3 + $PHPUNIT --configuration phpunit-autotest.xml --log-junit autotest-results-$1.xml --coverage-clover autotest-clover-$1.xml --coverage-html coverage-html-$1 $2 $3 else echo "No coverage" - phpunit --configuration phpunit-autotest.xml --log-junit autotest-results-$1.xml $2 $3 + $PHPUNIT --configuration phpunit-autotest.xml --log-junit autotest-results-$1.xml $2 $3 fi } From 09bd5bd517fee80e8b44b7645b51a8ba482a4d7c Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Thu, 12 Dec 2013 11:32:56 +0100 Subject: [PATCH 029/293] Added isUserAgent() method to request - added isUserAgent() method to OC_Request which makes it possible to test it - OC_Response::setContentDisposition now uses OC_Request::isUserAgent() --- lib/private/request.php | 23 ++++++++++++++++++ lib/private/response.php | 3 +-- tests/lib/request.php | 50 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 74 insertions(+), 2 deletions(-) diff --git a/lib/private/request.php b/lib/private/request.php index b2afda3592..d9d5ae08e2 100755 --- a/lib/private/request.php +++ b/lib/private/request.php @@ -7,6 +7,11 @@ */ class OC_Request { + + const USER_AGENT_IE = '/MSIE/'; + // Android Chrome user agent: https://developers.google.com/chrome/mobile/docs/user-agent + const USER_AGENT_ANDROID_MOBILE_CHROME = '#Android.*Chrome/[.0-9]*#'; + /** * @brief Check overwrite condition * @param string $type @@ -210,4 +215,22 @@ class OC_Request { return false; } } + + /** + * Checks whether the user agent matches a given regex + * @param string|array $agent agent name or array of agent names + * @return boolean true if at least one of the given agent matches, + * false otherwise + */ + static public function isUserAgent($agent) { + if (!is_array($agent)) { + $agent = array($agent); + } + foreach ($agent as $regex) { + if (preg_match($regex, $_SERVER['HTTP_USER_AGENT'])) { + return true; + } + } + return false; + } } diff --git a/lib/private/response.php b/lib/private/response.php index c6edda0f94..0474643734 100644 --- a/lib/private/response.php +++ b/lib/private/response.php @@ -153,8 +153,7 @@ class OC_Response { * @param string $type disposition type, either 'attachment' or 'inline' */ static public function setContentDispositionHeader( $filename, $type = 'attachment' ) { - // Android Chrome user agent: https://developers.google.com/chrome/mobile/docs/user-agent - if ( preg_match( '/MSIE/', $_SERVER['HTTP_USER_AGENT'] ) or preg_match( '#Android.*Chrome/[.0-9]*#', $_SERVER['HTTP_USER_AGENT'] ) ) { + if (OC_Request::isUserAgent(array(OC_Request::USER_AGENT_IE, OC_Request::USER_AGENT_ANDROID_MOBILE_CHROME))) { header( 'Content-Disposition: ' . rawurlencode($type) . '; filename="' . rawurlencode( $filename ) . '"' ); } else { header( 'Content-Disposition: ' . rawurlencode($type) . '; filename*=UTF-8\'\'' . rawurlencode( $filename ) diff --git a/tests/lib/request.php b/tests/lib/request.php index 090cebc923..c6401a5714 100644 --- a/tests/lib/request.php +++ b/tests/lib/request.php @@ -70,4 +70,54 @@ class Test_Request extends PHPUnit_Framework_TestCase { array('/oc/core1', '/oc/core/index.php'), ); } + + /** + * @dataProvider userAgentProvider + */ + public function testUserAgent($testAgent, $userAgent, $matches) { + $_SERVER['HTTP_USER_AGENT'] = $testAgent; + $this->assertEquals($matches, OC_Request::isUserAgent($userAgent)); + } + + function userAgentProvider() { + return array( + array( + 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)', + OC_Request::USER_AGENT_IE, + true + ), + array( + 'Mozilla/5.0 (X11; Linux i686; rv:24.0) Gecko/20100101 Firefox/24.0', + OC_Request::USER_AGENT_IE, + false + ), + array( + 'Mozilla/5.0 (Linux; Android 4.4; Nexus 4 Build/KRT16S) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.59 Mobile Safari/537.36', + OC_Request::USER_AGENT_ANDROID_MOBILE_CHROME, + true + ), + array( + 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)', + OC_Request::USER_AGENT_ANDROID_MOBILE_CHROME, + false + ), + // test two values + array( + 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)', + array( + OC_Request::USER_AGENT_IE, + OC_Request::USER_AGENT_ANDROID_MOBILE_CHROME, + ), + true + ), + array( + 'Mozilla/5.0 (Linux; Android 4.4; Nexus 4 Build/KRT16S) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.59 Mobile Safari/537.36', + array( + OC_Request::USER_AGENT_IE, + OC_Request::USER_AGENT_ANDROID_MOBILE_CHROME, + ), + true + ), + ); + } } From 1c0b8ed21421334fed1a699e52dbb5765b66f96d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Fri, 20 Dec 2013 13:48:46 +0100 Subject: [PATCH 030/293] Adding a random postfix to the part file. --- lib/private/connector/sabre/file.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/private/connector/sabre/file.php b/lib/private/connector/sabre/file.php index 295575f0af..d476e9fab1 100644 --- a/lib/private/connector/sabre/file.php +++ b/lib/private/connector/sabre/file.php @@ -64,7 +64,7 @@ class OC_Connector_Sabre_File extends OC_Connector_Sabre_Node implements Sabre_D } // mark file as partial while uploading (ignored by the scanner) - $partpath = $this->path . '.part'; + $partpath = $this->path . rand() . '.part'; // if file is located in /Shared we write the part file to the users // root folder because we can't create new files in /shared From dcded92c3ed7851174972595d884fe2872258b8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Tue, 24 Dec 2013 22:21:50 +0100 Subject: [PATCH 031/293] enable ldap tests --- tests/enable_all.php | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/enable_all.php b/tests/enable_all.php index 43ee16a72f..4f2fe5cdb6 100644 --- a/tests/enable_all.php +++ b/tests/enable_all.php @@ -10,6 +10,7 @@ require_once __DIR__.'/../lib/base.php'; OC_App::enable('files_sharing'); OC_App::enable('files_encryption'); +OC_App::enable('user_ldap'); OC_App::enable('calendar'); OC_App::enable('contacts'); OC_App::enable('apptemplateadvanced'); From 988710b0fc4e77b1a565a9f3ee4e7f24a539e057 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Tue, 31 Dec 2013 14:34:28 +0100 Subject: [PATCH 032/293] avoid conflict with physical file config.js --- core/routes.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/routes.php b/core/routes.php index 5009243d59..f8454877e0 100644 --- a/core/routes.php +++ b/core/routes.php @@ -7,6 +7,7 @@ */ // Post installation check +/** @var $this OC_Router */ $this->create('post_setup_check', '/post-setup-check') ->action('OC_Setup', 'postSetupCheck'); @@ -61,7 +62,7 @@ $this->create('core_tags_delete', '/tags/{type}/delete') ->action('OC\Core\Tags\Controller', 'deleteTags') ->requirements(array('type')); // oC JS config -$this->create('js_config', '/core/js/config.js') +$this->create('js_config', '/core/js/oc.js') ->actionInclude('core/js/config.php'); // Routing $this->create('core_ajax_routes', '/core/routes.json') From ae5671d2813f74562b77ae4288f01b4ed5ed52be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Tue, 31 Dec 2013 14:36:02 +0100 Subject: [PATCH 033/293] new config parameter 'front_controller_active' which will instruct the url generator to generate urls without index.php --- lib/private/server.php | 5 +++-- lib/private/urlgenerator.php | 25 ++++++++++++++++++++++++- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/lib/private/server.php b/lib/private/server.php index 77c3732a9c..17565fafa4 100644 --- a/lib/private/server.php +++ b/lib/private/server.php @@ -120,7 +120,8 @@ class Server extends SimpleContainer implements IServerContainer { return new \OC\L10N\Factory(); }); $this->registerService('URLGenerator', function($c) { - return new \OC\URLGenerator(); + $config = $this->getConfig(); + return new \OC\URLGenerator($config); }); $this->registerService('AppHelper', function($c) { return new \OC\AppHelper(); @@ -249,7 +250,7 @@ class Server extends SimpleContainer implements IServerContainer { } /** - * @return \OC\Config + * @return \OCP\IConfig */ function getConfig() { return $this->query('AllConfig'); diff --git a/lib/private/urlgenerator.php b/lib/private/urlgenerator.php index 7795011fd0..4e3c110900 100644 --- a/lib/private/urlgenerator.php +++ b/lib/private/urlgenerator.php @@ -15,6 +15,19 @@ use RuntimeException; * Class to generate URLs */ class URLGenerator implements IURLGenerator { + + /** + * @var \OCP\IConfig + */ + private $config; + + /** + * @param \OCP\IConfig $config + */ + public function __construct($config) { + $this->config = $config; + } + /** * @brief Creates an url using a defined route * @param $route @@ -41,12 +54,18 @@ class URLGenerator implements IURLGenerator { * Returns a url to the given app and file. */ public function linkTo( $app, $file, $args = array() ) { + $frontControllerActive=($this->config->getSystemValue('front_controller_active', 'false') == 'true'); + if( $app != '' ) { $app_path = \OC_App::getAppPath($app); // 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 . '/index.php/apps/' . $app; + if ($frontControllerActive) { + $urlLinkTo = \OC::$WEBROOT . '/apps/' . $app; + } $urlLinkTo .= ($file != 'index.php') ? '/' . $file : ''; } else { $urlLinkTo = \OC_App::getAppWebPath($app) . '/' . $file; @@ -58,7 +77,11 @@ class URLGenerator implements IURLGenerator { if (file_exists(\OC::$SERVERROOT . '/core/' . $file)) { $urlLinkTo = \OC::$WEBROOT . '/core/' . $file; } else { - $urlLinkTo = \OC::$WEBROOT . '/' . $file; + if ($frontControllerActive && $file === 'index.php') { + $urlLinkTo = \OC::$WEBROOT; + } else { + $urlLinkTo = \OC::$WEBROOT . '/' . $file; + } } } From 6254f0a403e315461f8e20ebccf71cb91e9313a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Tue, 31 Dec 2013 15:12:17 +0100 Subject: [PATCH 034/293] use getAppWebPath() in here as well --- lib/private/template/cssresourcelocator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/private/template/cssresourcelocator.php b/lib/private/template/cssresourcelocator.php index 8e7831ca54..e26daa2582 100644 --- a/lib/private/template/cssresourcelocator.php +++ b/lib/private/template/cssresourcelocator.php @@ -22,7 +22,7 @@ class CSSResourceLocator extends ResourceLocator { $app = substr($style, 0, strpos($style, '/')); $style = substr($style, strpos($style, '/')+1); $app_path = \OC_App::getAppPath($app); - $app_url = $this->webroot . '/index.php/apps/' . $app; + $app_url = \OC_App::getAppWebPath($app); if ($this->appendIfExist($app_path, $style.$this->form_factor.'.css', $app_url) || $this->appendIfExist($app_path, $style.'.css', $app_url) ) { From 214aecac78c5efa499591937241e13b45d2b9e05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Sun, 5 Jan 2014 21:49:08 +0100 Subject: [PATCH 035/293] require composer's autoload.php if present --- lib/base.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/base.php b/lib/base.php index d3e483f494..cf1ffc0177 100644 --- a/lib/base.php +++ b/lib/base.php @@ -410,8 +410,6 @@ class OC { self::$loader->registerPrefix('Doctrine\\DBAL', 'doctrine/dbal/lib'); self::$loader->registerPrefix('Symfony\\Component\\Routing', 'symfony/routing'); self::$loader->registerPrefix('Symfony\\Component\\Console', 'symfony/console'); - self::$loader->registerPrefix('Sabre\\VObject', '3rdparty'); - self::$loader->registerPrefix('Sabre_', '3rdparty'); self::$loader->registerPrefix('Patchwork', '3rdparty'); spl_autoload_register(array(self::$loader, 'load')); @@ -479,6 +477,12 @@ class OC { } OC_Util::isSetLocaleWorking(); + // setup 3rdparty autoloader + $vendorAutoLoad = OC::$THIRDPARTYROOT . '/3rdparty/autoload.php'; + if (@file_exists($vendorAutoLoad)) { + require_once $vendorAutoLoad; + } + // set debug mode if an xdebug session is active if (!defined('DEBUG') || !DEBUG) { if (isset($_COOKIE['XDEBUG_SESSION'])) { From fc79662eca5347480d42b107fd7db24287e00aec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Sun, 5 Jan 2014 21:49:50 +0100 Subject: [PATCH 036/293] reference 3rdparty branch with SabreDAV 1.7.9 installed using composer --- 3rdparty | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty b/3rdparty index 42efd96628..0faf6063ac 160000 --- a/3rdparty +++ b/3rdparty @@ -1 +1 @@ -Subproject commit 42efd966284debadf83b761367e529bc45f806d6 +Subproject commit 0faf6063ac55d3bc82d2a781548ad0f00e77360c From baccc8f584940d607393ef2bdd9c6d3e511b75b8 Mon Sep 17 00:00:00 2001 From: ben-denham Date: Mon, 6 Jan 2014 11:14:43 +1300 Subject: [PATCH 037/293] Unshare all will now delete all shares for the item, instead of only for a single owner. --- lib/public/share.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/public/share.php b/lib/public/share.php index f0fd8e1ab1..eb1dd8d1c9 100644 --- a/lib/public/share.php +++ b/lib/public/share.php @@ -655,7 +655,15 @@ class Share { * @return Returns true on success or false on failure */ public static function unshareAll($itemType, $itemSource) { - if ($shares = self::getItemShared($itemType, $itemSource)) { + // Get all of the owners of shares of this item. + $query = \OC_DB::prepare( 'SELECT `uid_owner` from `*PREFIX*share` WHERE `item_type`=? AND `item_source`=?' ); + $result = $query->execute(array($itemType, $itemSource)); + $shares = array(); + // Add each owner's shares to the array of all shares for this item. + while ($row = $result->fetchRow()) { + $shares = array_merge($shares, self::getItems($itemType, $itemSource, null, null, $row['uid_owner'])); + } + if (!empty($shares)) { // Pass all the vars we have for now, they may be useful $hookParams = array( 'itemType' => $itemType, From 1df1b55b66f0bcc696a1ee9aeb8362dee9889100 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Mon, 6 Jan 2014 12:55:56 +0100 Subject: [PATCH 038/293] expose memory cache in public api --- lib/private/server.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/lib/private/server.php b/lib/private/server.php index bee70dec2d..84ee8cadf0 100644 --- a/lib/private/server.php +++ b/lib/private/server.php @@ -136,6 +136,10 @@ class Server extends SimpleContainer implements IServerContainer { $this->registerService('UserCache', function($c) { return new UserCache(); }); + $this->registerService('MemCache', function ($c) { + $factory = new \OC\Memcache\Factory(); + return $factory->create(); + }); $this->registerService('ActivityManager', function($c) { return new ActivityManager(); }); @@ -295,6 +299,15 @@ class Server extends SimpleContainer implements IServerContainer { return $this->query('UserCache'); } + /** + * Returns an ICache instance + * + * @return \OCP\ICache + */ + function getMemCache() { + return $this->query('MemCache'); + } + /** * Returns the current session * From cd147bb37ae247082442f87b3cdd7d3d752e2d37 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Mon, 6 Jan 2014 12:58:43 +0100 Subject: [PATCH 039/293] Use APCIterator for Memcache\APC::clear() --- lib/private/memcache/apc.php | 27 ++++++++------------------- lib/private/memcache/apcu.php | 7 ------- 2 files changed, 8 insertions(+), 26 deletions(-) diff --git a/lib/private/memcache/apc.php b/lib/private/memcache/apc.php index 575ee4427d..d5bc1498d6 100644 --- a/lib/private/memcache/apc.php +++ b/lib/private/memcache/apc.php @@ -9,15 +9,8 @@ namespace OC\Memcache; class APC extends Cache { - /** - * entries in APC gets namespaced to prevent collisions between owncloud instances and users - */ - protected function getNameSpace() { - return $this->prefix; - } - public function get($key) { - $result = apc_fetch($this->getNamespace() . $key, $success); + $result = apc_fetch($this->getPrefix() . $key, $success); if (!$success) { return null; } @@ -25,26 +18,22 @@ class APC extends Cache { } public function set($key, $value, $ttl = 0) { - return apc_store($this->getNamespace() . $key, $value, $ttl); + return apc_store($this->getPrefix() . $key, $value, $ttl); } public function hasKey($key) { - return apc_exists($this->getNamespace() . $key); + return apc_exists($this->getPrefix() . $key); } public function remove($key) { - return apc_delete($this->getNamespace() . $key); + return apc_delete($this->getPrefix() . $key); } public function clear($prefix = '') { - $ns = $this->getNamespace() . $prefix; - $cache = apc_cache_info('user'); - foreach ($cache['cache_list'] as $entry) { - if (strpos($entry['info'], $ns) === 0) { - apc_delete($entry['info']); - } - } - return true; + $ns = $this->getPrefix() . $prefix; + $ns = preg_quote($ns, '/'); + $iter = new \APCIterator('user', '/^' . $ns . '/'); + return apc_delete($iter); } static public function isAvailable() { diff --git a/lib/private/memcache/apcu.php b/lib/private/memcache/apcu.php index dac0f5f208..7f780f3271 100644 --- a/lib/private/memcache/apcu.php +++ b/lib/private/memcache/apcu.php @@ -9,13 +9,6 @@ namespace OC\Memcache; class APCu extends APC { - public function clear($prefix = '') { - $ns = $this->getNamespace() . $prefix; - $ns = preg_quote($ns, '/'); - $iter = new \APCIterator('user', '/^'.$ns.'/'); - return apc_delete($iter); - } - static public function isAvailable() { if (!extension_loaded('apcu')) { return false; From 4d65a8089284e4dde09181b56fb45b86c50d6fb5 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Mon, 6 Jan 2014 13:11:38 +0100 Subject: [PATCH 040/293] Remove the static dependency on OC_Util from Memcache --- lib/private/memcache/cache.php | 2 +- lib/private/memcache/factory.php | 13 +++++++++++++ lib/private/server.php | 3 ++- lib/public/iservercontainer.php | 7 +++++++ 4 files changed, 23 insertions(+), 2 deletions(-) diff --git a/lib/private/memcache/cache.php b/lib/private/memcache/cache.php index 0ad1cc7ec0..03671b3f24 100644 --- a/lib/private/memcache/cache.php +++ b/lib/private/memcache/cache.php @@ -18,7 +18,7 @@ abstract class Cache implements \ArrayAccess { * @param string $prefix */ public function __construct($prefix = '') { - $this->prefix = \OC_Util::getInstanceId() . '/' . $prefix; + $this->prefix = $prefix; } public function getPrefix() { diff --git a/lib/private/memcache/factory.php b/lib/private/memcache/factory.php index fde7d94756..48c97b5955 100644 --- a/lib/private/memcache/factory.php +++ b/lib/private/memcache/factory.php @@ -9,6 +9,18 @@ namespace OC\Memcache; class Factory { + /** + * @var string $globalPrefix + */ + private $globalPrefix; + + /** + * @param string $globalPrefix + */ + public function __construct($globalPrefix) { + $this->globalPrefix = $globalPrefix; + } + /** * get a cache instance, will return null if no backend is available * @@ -16,6 +28,7 @@ class Factory { * @return \OC\Memcache\Cache */ function create($prefix = '') { + $prefix = $this->globalPrefix . '/' . $prefix; if (XCache::isAvailable()) { return new XCache($prefix); } elseif (APCu::isAvailable()) { diff --git a/lib/private/server.php b/lib/private/server.php index 84ee8cadf0..6b242bddd0 100644 --- a/lib/private/server.php +++ b/lib/private/server.php @@ -137,7 +137,8 @@ class Server extends SimpleContainer implements IServerContainer { return new UserCache(); }); $this->registerService('MemCache', function ($c) { - $factory = new \OC\Memcache\Factory(); + $instanceId = \OC_Util::getInstanceId(); + $factory = new \OC\Memcache\Factory($instanceId); return $factory->create(); }); $this->registerService('ActivityManager', function($c) { diff --git a/lib/public/iservercontainer.php b/lib/public/iservercontainer.php index b958d2d03f..7ac5049ef2 100644 --- a/lib/public/iservercontainer.php +++ b/lib/public/iservercontainer.php @@ -141,6 +141,13 @@ interface IServerContainer { */ function getCache(); + /** + * Returns an ICache instance + * + * @return \OCP\ICache + */ + function getMemCache(); + /** * Returns the current session * From d2f2645a6a7e802c6cda31747481fe49b7ca0807 Mon Sep 17 00:00:00 2001 From: Jenkins for ownCloud Date: Tue, 7 Jan 2014 01:56:11 -0500 Subject: [PATCH 041/293] [tx-robot] updated from transifex --- apps/files/l10n/et_EE.php | 2 + apps/files/l10n/ur.php | 7 + apps/files_sharing/l10n/el.php | 10 +- apps/files_trashbin/l10n/el.php | 4 +- apps/files_versions/l10n/el.php | 2 +- apps/user_ldap/l10n/ur.php | 6 + core/l10n/ur.php | 9 + l10n/el/core.po | 26 +- l10n/el/files.po | 4 +- l10n/el/files_sharing.po | 16 +- l10n/el/files_trashbin.po | 31 +- l10n/el/files_versions.po | 21 +- l10n/el/settings.po | 4 +- l10n/el/user_ldap.po | 4 +- l10n/et_EE/files.po | 12 +- l10n/fr/files.po | 4 +- l10n/fr/files_sharing.po | 4 +- 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_trashbin.pot | 2 +- l10n/templates/files_versions.pot | 2 +- l10n/templates/lib.pot | 2 +- l10n/templates/private.pot | 2 +- l10n/templates/settings.pot | 2 +- l10n/templates/user_ldap.pot | 2 +- l10n/templates/user_webdavauth.pot | 2 +- l10n/ur/core.po | 775 ++++++++++++++++++++++++++++ l10n/ur/files.po | 413 +++++++++++++++ l10n/ur/files_encryption.po | 201 ++++++++ l10n/ur/files_external.po | 123 +++++ l10n/ur/files_sharing.po | 84 +++ l10n/ur/files_trashbin.po | 60 +++ l10n/ur/files_versions.po | 43 ++ l10n/ur/lib.po | 333 ++++++++++++ l10n/ur/settings.po | 668 ++++++++++++++++++++++++ l10n/ur/user_ldap.po | 513 ++++++++++++++++++ l10n/ur/user_webdavauth.po | 33 ++ lib/l10n/ur.php | 8 + 41 files changed, 3362 insertions(+), 82 deletions(-) create mode 100644 apps/files/l10n/ur.php create mode 100644 apps/user_ldap/l10n/ur.php create mode 100644 core/l10n/ur.php create mode 100644 l10n/ur/core.po create mode 100644 l10n/ur/files.po create mode 100644 l10n/ur/files_encryption.po create mode 100644 l10n/ur/files_external.po create mode 100644 l10n/ur/files_sharing.po create mode 100644 l10n/ur/files_trashbin.po create mode 100644 l10n/ur/files_versions.po create mode 100644 l10n/ur/lib.po create mode 100644 l10n/ur/settings.po create mode 100644 l10n/ur/user_ldap.po create mode 100644 l10n/ur/user_webdavauth.po create mode 100644 lib/l10n/ur.php diff --git a/apps/files/l10n/et_EE.php b/apps/files/l10n/et_EE.php index 98f74e1f00..fd03152773 100644 --- a/apps/files/l10n/et_EE.php +++ b/apps/files/l10n/et_EE.php @@ -6,6 +6,7 @@ $TRANSLATIONS = array( "File name must not contain \"/\". Please choose a different name." => "Faili nimi ei tohi sisaldada \"/\". Palun vali mõni teine nimi.", "The name %s is already used in the folder %s. Please choose a different name." => "Nimi %s on juba kasutusel kataloogis %s. Palun vali mõni teine nimi.", "Not a valid source" => "Pole korrektne lähteallikas", +"Server is not allowed to open URLs, please check the server configuration" => "Server ei võimalda URL-ide avamist, palun kontrolli serveri seadistust", "Error while downloading %s to %s" => "Viga %s allalaadimisel %s", "Error when creating the file" => "Viga faili loomisel", "Folder name cannot be empty." => "Kataloogi nimi ei saa olla tühi.", @@ -36,6 +37,7 @@ $TRANSLATIONS = array( "{new_name} already exists" => "{new_name} on juba olemas", "Could not create file" => "Ei suuda luua faili", "Could not create folder" => "Ei suuda luua kataloogi", +"Error fetching URL" => "Viga URL-i haaramisel", "Share" => "Jaga", "Delete permanently" => "Kustuta jäädavalt", "Rename" => "Nimeta ümber", diff --git a/apps/files/l10n/ur.php b/apps/files/l10n/ur.php new file mode 100644 index 0000000000..0157af093e --- /dev/null +++ b/apps/files/l10n/ur.php @@ -0,0 +1,7 @@ + array("",""), +"_%n file_::_%n files_" => array("",""), +"_Uploading %n file_::_Uploading %n files_" => array("","") +); +$PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/files_sharing/l10n/el.php b/apps/files_sharing/l10n/el.php index 79387a9147..3ea666504b 100644 --- a/apps/files_sharing/l10n/el.php +++ b/apps/files_sharing/l10n/el.php @@ -1,19 +1,19 @@ "Αυτός ο κοινόχρηστος φάκελος προστατεύεται με κωδικό", -"The password is wrong. Try again." => "Εσφαλμένο συνθηματικό. Προσπαθήστε ξανά.", -"Password" => "Συνθηματικό", +"The password is wrong. Try again." => "Εσφαλμένος κωδικός πρόσβασης. Προσπαθήστε ξανά.", +"Password" => "Κωδικός πρόσβασης", "Sorry, this link doesn’t seem to work anymore." => "Συγγνώμη, αυτός ο σύνδεσμος μοιάζει να μην ισχύει πια.", "Reasons might be:" => "Οι λόγοι μπορεί να είναι:", "the item was removed" => "το αντικείμενο απομακρύνθηκε", "the link expired" => "ο σύνδεσμος έληξε", "sharing is disabled" => "ο διαμοιρασμός απενεργοποιήθηκε", "For more info, please ask the person who sent this link." => "Για περισσότερες πληροφορίες, παρακαλώ ρωτήστε το άτομο που σας έστειλε αυτόν τον σύνδεσμο.", -"%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" => "Λήψη", "Upload" => "Μεταφόρτωση", -"Cancel upload" => "Ακύρωση αποστολής", +"Cancel upload" => "Ακύρωση μεταφόρτωσης", "No preview available for" => "Δεν υπάρχει διαθέσιμη προεπισκόπηση για", "Direct link" => "Άμεσος σύνδεσμος" ); diff --git a/apps/files_trashbin/l10n/el.php b/apps/files_trashbin/l10n/el.php index ffeafb7e9d..b4ee30c578 100644 --- a/apps/files_trashbin/l10n/el.php +++ b/apps/files_trashbin/l10n/el.php @@ -3,11 +3,11 @@ $TRANSLATIONS = array( "Couldn't delete %s permanently" => "Αδύνατη η μόνιμη διαγραφή του %s", "Couldn't restore %s" => "Αδυναμία επαναφοράς %s", "Error" => "Σφάλμα", -"restored" => "έγινε επαναφορά", +"restored" => "επαναφέρθηκαν", "Nothing in here. Your trash bin is empty!" => "Δεν υπάρχει τίποτα εδώ. Ο κάδος σας είναι άδειος!", "Name" => "Όνομα", "Restore" => "Επαναφορά", -"Deleted" => "Διαγράφηκε", +"Deleted" => "Διαγραμμένα", "Delete" => "Διαγραφή", "Deleted Files" => "Διαγραμμένα Αρχεία" ); diff --git a/apps/files_versions/l10n/el.php b/apps/files_versions/l10n/el.php index af608e7c04..5337f3b5a4 100644 --- a/apps/files_versions/l10n/el.php +++ b/apps/files_versions/l10n/el.php @@ -1,6 +1,6 @@ "Αδυναμία επαναφοράς του: %s", +"Could not revert: %s" => "Αδυναμία επαναφοράς: %s", "Versions" => "Εκδόσεις", "Failed to revert {file} to revision {timestamp}." => "Αποτυχία επαναφοράς του {file} στην αναθεώρηση {timestamp}.", "More versions..." => "Περισσότερες εκδόσεις...", diff --git a/apps/user_ldap/l10n/ur.php b/apps/user_ldap/l10n/ur.php new file mode 100644 index 0000000000..3a1e002311 --- /dev/null +++ b/apps/user_ldap/l10n/ur.php @@ -0,0 +1,6 @@ + array("",""), +"_%s user found_::_%s users found_" => array("","") +); +$PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/core/l10n/ur.php b/core/l10n/ur.php new file mode 100644 index 0000000000..ffcdde48d4 --- /dev/null +++ b/core/l10n/ur.php @@ -0,0 +1,9 @@ + array("",""), +"_%n hour ago_::_%n hours ago_" => array("",""), +"_%n day ago_::_%n days ago_" => array("",""), +"_%n month ago_::_%n months ago_" => array("",""), +"_{count} file conflict_::_{count} file conflicts_" => array("","") +); +$PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/l10n/el/core.po b/l10n/el/core.po index b0f4b9ecc5..b453459ddc 100644 --- a/l10n/el/core.po +++ b/l10n/el/core.po @@ -16,8 +16,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" -"POT-Creation-Date: 2014-01-04 01:55-0500\n" -"PO-Revision-Date: 2014-01-02 17:40+0000\n" +"POT-Creation-Date: 2014-01-07 01:55-0500\n" +"PO-Revision-Date: 2014-01-06 20:50+0000\n" "Last-Translator: vkehayas \n" "Language-Team: Greek (http://www.transifex.com/projects/p/owncloud/language/el/)\n" "MIME-Version: 1.0\n" @@ -161,55 +161,55 @@ msgstr "Δεκέμβριος" msgid "Settings" msgstr "Ρυθμίσεις" -#: js/js.js:869 +#: js/js.js:872 msgid "seconds ago" msgstr "δευτερόλεπτα πριν" -#: js/js.js:870 +#: js/js.js:873 msgid "%n minute ago" msgid_plural "%n minutes ago" msgstr[0] "%n λεπτό πριν" msgstr[1] "%n λεπτά πριν" -#: js/js.js:871 +#: js/js.js:874 msgid "%n hour ago" msgid_plural "%n hours ago" msgstr[0] "%n ώρα πριν" msgstr[1] "%n ώρες πριν" -#: js/js.js:872 +#: js/js.js:875 msgid "today" msgstr "σήμερα" -#: js/js.js:873 +#: js/js.js:876 msgid "yesterday" msgstr "χτες" -#: js/js.js:874 +#: js/js.js:877 msgid "%n day ago" msgid_plural "%n days ago" msgstr[0] "%n ημέρα πριν" msgstr[1] "%n ημέρες πριν" -#: js/js.js:875 +#: js/js.js:878 msgid "last month" msgstr "τελευταίο μήνα" -#: js/js.js:876 +#: js/js.js:879 msgid "%n month ago" msgid_plural "%n months ago" msgstr[0] "%n μήνας πριν" msgstr[1] "%n μήνες πριν" -#: js/js.js:877 +#: js/js.js:880 msgid "months ago" msgstr "μήνες πριν" -#: js/js.js:878 +#: js/js.js:881 msgid "last year" msgstr "τελευταίο χρόνο" -#: js/js.js:879 +#: js/js.js:882 msgid "years ago" msgstr "χρόνια πριν" diff --git a/l10n/el/files.po b/l10n/el/files.po index 1171a1f728..84a38b5c6e 100644 --- a/l10n/el/files.po +++ b/l10n/el/files.po @@ -12,8 +12,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" -"POT-Creation-Date: 2013-12-31 01:55-0500\n" -"PO-Revision-Date: 2013-12-30 16:00+0000\n" +"POT-Creation-Date: 2014-01-07 01:55-0500\n" +"PO-Revision-Date: 2014-01-06 20:50+0000\n" "Last-Translator: vkehayas \n" "Language-Team: Greek (http://www.transifex.com/projects/p/owncloud/language/el/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/el/files_sharing.po b/l10n/el/files_sharing.po index 09221d38d5..1c70dfb1d6 100644 --- a/l10n/el/files_sharing.po +++ b/l10n/el/files_sharing.po @@ -4,13 +4,13 @@ # # Translators: # Efstathios Iosifidis , 2013 -# vkehayas , 2013 +# vkehayas , 2013-2014 msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" -"POT-Creation-Date: 2014-01-04 01:55-0500\n" -"PO-Revision-Date: 2014-01-02 17:40+0000\n" +"POT-Creation-Date: 2014-01-07 01:55-0500\n" +"PO-Revision-Date: 2014-01-06 21:00+0000\n" "Last-Translator: vkehayas \n" "Language-Team: Greek (http://www.transifex.com/projects/p/owncloud/language/el/)\n" "MIME-Version: 1.0\n" @@ -25,11 +25,11 @@ msgstr "Αυτός ο κοινόχρηστος φάκελος προστατεύ #: templates/authenticate.php:7 msgid "The password is wrong. Try again." -msgstr "Εσφαλμένο συνθηματικό. Προσπαθήστε ξανά." +msgstr "Εσφαλμένος κωδικός πρόσβασης. Προσπαθήστε ξανά." #: templates/authenticate.php:10 msgid "Password" -msgstr "Συνθηματικό" +msgstr "Κωδικός πρόσβασης" #: templates/part.404.php:3 msgid "Sorry, this link doesn’t seem to work anymore." @@ -58,12 +58,12 @@ msgstr "Για περισσότερες πληροφορίες, παρακαλώ #: templates/public.php:18 #, php-format msgid "%s shared the folder %s with you" -msgstr "%s μοιράστηκε τον φάκελο %s μαζί σας" +msgstr "Ο %s μοιράστηκε τον φάκελο %s μαζί σας" #: templates/public.php:21 #, php-format msgid "%s shared the file %s with you" -msgstr "%s μοιράστηκε το αρχείο %s μαζί σας" +msgstr "Ο %s μοιράστηκε το αρχείο %s μαζί σας" #: templates/public.php:29 templates/public.php:95 msgid "Download" @@ -75,7 +75,7 @@ msgstr "Μεταφόρτωση" #: templates/public.php:59 msgid "Cancel upload" -msgstr "Ακύρωση αποστολής" +msgstr "Ακύρωση μεταφόρτωσης" #: templates/public.php:92 msgid "No preview available for" diff --git a/l10n/el/files_trashbin.po b/l10n/el/files_trashbin.po index 57aa40f148..0d05dc752d 100644 --- a/l10n/el/files_trashbin.po +++ b/l10n/el/files_trashbin.po @@ -4,13 +4,14 @@ # # Translators: # Efstathios Iosifidis , 2013 +# vkehayas , 2014 msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" -"POT-Creation-Date: 2013-11-21 10:01-0500\n" -"PO-Revision-Date: 2013-11-16 07:44+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2014-01-07 01:55-0500\n" +"PO-Revision-Date: 2014-01-06 21:15+0000\n" +"Last-Translator: vkehayas \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" @@ -18,44 +19,44 @@ msgstr "" "Language: el\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ajax/delete.php:42 +#: ajax/delete.php:63 #, php-format msgid "Couldn't delete %s permanently" msgstr "Αδύνατη η μόνιμη διαγραφή του %s" -#: ajax/undelete.php:42 +#: ajax/undelete.php:43 #, php-format msgid "Couldn't restore %s" msgstr "Αδυναμία επαναφοράς %s" -#: js/trash.js:18 js/trash.js:44 js/trash.js:121 js/trash.js:149 +#: js/trash.js:18 js/trash.js:45 js/trash.js:88 js/trash.js:142 msgid "Error" msgstr "Σφάλμα" -#: lib/trashbin.php:815 lib/trashbin.php:817 +#: lib/trashbin.php:905 lib/trashbin.php:907 msgid "restored" -msgstr "έγινε επαναφορά" +msgstr "επαναφέρθηκαν" -#: templates/index.php:8 +#: templates/index.php:7 msgid "Nothing in here. Your trash bin is empty!" msgstr "Δεν υπάρχει τίποτα εδώ. Ο κάδος σας είναι άδειος!" -#: templates/index.php:22 +#: templates/index.php:20 msgid "Name" msgstr "Όνομα" -#: templates/index.php:25 templates/index.php:27 +#: templates/index.php:23 templates/index.php:25 msgid "Restore" msgstr "Επαναφορά" -#: templates/index.php:33 +#: templates/index.php:31 msgid "Deleted" -msgstr "Διαγράφηκε" +msgstr "Διαγραμμένα" -#: templates/index.php:36 templates/index.php:37 +#: templates/index.php:34 templates/index.php:35 msgid "Delete" msgstr "Διαγραφή" -#: templates/part.breadcrumb.php:9 +#: templates/part.breadcrumb.php:8 msgid "Deleted Files" msgstr "Διαγραμμένα Αρχεία" diff --git a/l10n/el/files_versions.po b/l10n/el/files_versions.po index 69a93edf4e..33ed352c92 100644 --- a/l10n/el/files_versions.po +++ b/l10n/el/files_versions.po @@ -4,13 +4,14 @@ # # Translators: # Efstathios Iosifidis , 2013 +# vkehayas , 2014 msgid "" msgstr "" "Project-Id-Version: ownCloud\n" -"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2013-08-07 08:59-0400\n" -"PO-Revision-Date: 2013-08-06 07:40+0000\n" -"Last-Translator: Efstathios Iosifidis \n" +"Report-Msgid-Bugs-To: translations@owncloud.org\n" +"POT-Creation-Date: 2014-01-07 01:55-0500\n" +"PO-Revision-Date: 2014-01-06 21:15+0000\n" +"Last-Translator: vkehayas \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" @@ -21,24 +22,24 @@ msgstr "" #: ajax/rollbackVersion.php:13 #, php-format msgid "Could not revert: %s" -msgstr "Αδυναμία επαναφοράς του: %s" +msgstr "Αδυναμία επαναφοράς: %s" -#: js/versions.js:7 +#: js/versions.js:14 msgid "Versions" msgstr "Εκδόσεις" -#: js/versions.js:53 +#: js/versions.js:60 msgid "Failed to revert {file} to revision {timestamp}." msgstr "Αποτυχία επαναφοράς του {file} στην αναθεώρηση {timestamp}." -#: js/versions.js:79 +#: js/versions.js:86 msgid "More versions..." msgstr "Περισσότερες εκδόσεις..." -#: js/versions.js:116 +#: js/versions.js:123 msgid "No other versions available" msgstr "Δεν υπάρχουν άλλες εκδόσεις διαθέσιμες" -#: js/versions.js:149 +#: js/versions.js:154 msgid "Restore" msgstr "Επαναφορά" diff --git a/l10n/el/settings.po b/l10n/el/settings.po index a899dcc3fc..84b51f5709 100644 --- a/l10n/el/settings.po +++ b/l10n/el/settings.po @@ -14,8 +14,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" -"POT-Creation-Date: 2014-01-04 01:55-0500\n" -"PO-Revision-Date: 2014-01-02 18:11+0000\n" +"POT-Creation-Date: 2014-01-07 01:55-0500\n" +"PO-Revision-Date: 2014-01-06 20:50+0000\n" "Last-Translator: vkehayas \n" "Language-Team: Greek (http://www.transifex.com/projects/p/owncloud/language/el/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/el/user_ldap.po b/l10n/el/user_ldap.po index a7c6ef95f4..636f833c27 100644 --- a/l10n/el/user_ldap.po +++ b/l10n/el/user_ldap.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" -"POT-Creation-Date: 2014-01-04 01:55-0500\n" -"PO-Revision-Date: 2014-01-02 18:11+0000\n" +"POT-Creation-Date: 2014-01-07 01:55-0500\n" +"PO-Revision-Date: 2014-01-06 20:50+0000\n" "Last-Translator: vkehayas \n" "Language-Team: Greek (http://www.transifex.com/projects/p/owncloud/language/el/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/et_EE/files.po b/l10n/et_EE/files.po index d7c7f5265d..e83960e36b 100644 --- a/l10n/et_EE/files.po +++ b/l10n/et_EE/files.po @@ -3,15 +3,15 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: -# pisike.sipelgas , 2013 +# pisike.sipelgas , 2013-2014 # Rivo Zängov , 2013 msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" -"POT-Creation-Date: 2013-12-20 01:55-0500\n" -"PO-Revision-Date: 2013-12-20 06:23+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2014-01-07 01:55-0500\n" +"PO-Revision-Date: 2014-01-06 07:20+0000\n" +"Last-Translator: pisike.sipelgas \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" @@ -51,7 +51,7 @@ msgstr "Pole korrektne lähteallikas" #: ajax/newfile.php:86 msgid "" "Server is not allowed to open URLs, please check the server configuration" -msgstr "" +msgstr "Server ei võimalda URL-ide avamist, palun kontrolli serveri seadistust" #: ajax/newfile.php:103 #, php-format @@ -180,7 +180,7 @@ msgstr "Ei suuda luua kataloogi" #: js/file-upload.js:661 msgid "Error fetching URL" -msgstr "" +msgstr "Viga URL-i haaramisel" #: js/fileactions.js:125 msgid "Share" diff --git a/l10n/fr/files.po b/l10n/fr/files.po index 2bd2dbb16d..c6057d1fd5 100644 --- a/l10n/fr/files.po +++ b/l10n/fr/files.po @@ -12,8 +12,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" -"POT-Creation-Date: 2013-12-20 01:55-0500\n" -"PO-Revision-Date: 2013-12-20 06:23+0000\n" +"POT-Creation-Date: 2014-01-07 01:55-0500\n" +"PO-Revision-Date: 2014-01-06 14:30+0000\n" "Last-Translator: Christophe Lherieau \n" "Language-Team: French (http://www.transifex.com/projects/p/owncloud/language/fr/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/fr/files_sharing.po b/l10n/fr/files_sharing.po index c8c10e1bfe..3dbac303a0 100644 --- a/l10n/fr/files_sharing.po +++ b/l10n/fr/files_sharing.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" -"POT-Creation-Date: 2013-11-15 22:54-0500\n" -"PO-Revision-Date: 2013-11-13 16:11+0000\n" +"POT-Creation-Date: 2014-01-07 01:55-0500\n" +"PO-Revision-Date: 2014-01-06 14:30+0000\n" "Last-Translator: etiess \n" "Language-Team: French (http://www.transifex.com/projects/p/owncloud/language/fr/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/templates/core.pot b/l10n/templates/core.pot index 1ec73dd297..68737b3593 100644 --- a/l10n/templates/core.pot +++ b/l10n/templates/core.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud Core 6.0.0\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" -"POT-Creation-Date: 2014-01-06 01:55-0500\n" +"POT-Creation-Date: 2014-01-07 01:55-0500\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 e5f6887ddd..913a148343 100644 --- a/l10n/templates/files.pot +++ b/l10n/templates/files.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud Core 6.0.0\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" -"POT-Creation-Date: 2014-01-06 01:55-0500\n" +"POT-Creation-Date: 2014-01-07 01:55-0500\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 ae01087be4..5a6e1c929e 100644 --- a/l10n/templates/files_encryption.pot +++ b/l10n/templates/files_encryption.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud Core 6.0.0\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" -"POT-Creation-Date: 2014-01-06 01:55-0500\n" +"POT-Creation-Date: 2014-01-07 01:55-0500\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 5d95ea3384..1806d30ff0 100644 --- a/l10n/templates/files_external.pot +++ b/l10n/templates/files_external.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud Core 6.0.0\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" -"POT-Creation-Date: 2014-01-06 01:55-0500\n" +"POT-Creation-Date: 2014-01-07 01:55-0500\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 684d5663a9..ffba8dccd3 100644 --- a/l10n/templates/files_sharing.pot +++ b/l10n/templates/files_sharing.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud Core 6.0.0\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" -"POT-Creation-Date: 2014-01-06 01:55-0500\n" +"POT-Creation-Date: 2014-01-07 01:55-0500\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_trashbin.pot b/l10n/templates/files_trashbin.pot index 0b7e5f0160..8605f877f4 100644 --- a/l10n/templates/files_trashbin.pot +++ b/l10n/templates/files_trashbin.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud Core 6.0.0\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" -"POT-Creation-Date: 2014-01-06 01:55-0500\n" +"POT-Creation-Date: 2014-01-07 01:55-0500\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 e08efdb392..636e03756a 100644 --- a/l10n/templates/files_versions.pot +++ b/l10n/templates/files_versions.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud Core 6.0.0\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" -"POT-Creation-Date: 2014-01-06 01:55-0500\n" +"POT-Creation-Date: 2014-01-07 01:55-0500\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 9bcb4ce52a..85ae628dcd 100644 --- a/l10n/templates/lib.pot +++ b/l10n/templates/lib.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud Core 6.0.0\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" -"POT-Creation-Date: 2014-01-06 01:55-0500\n" +"POT-Creation-Date: 2014-01-07 01:55-0500\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/private.pot b/l10n/templates/private.pot index 250fadf183..11e0caf703 100644 --- a/l10n/templates/private.pot +++ b/l10n/templates/private.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud Core 6.0.0\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" -"POT-Creation-Date: 2014-01-06 01:55-0500\n" +"POT-Creation-Date: 2014-01-07 01:55-0500\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 e8fb417a51..5f01a453d6 100644 --- a/l10n/templates/settings.pot +++ b/l10n/templates/settings.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud Core 6.0.0\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" -"POT-Creation-Date: 2014-01-06 01:55-0500\n" +"POT-Creation-Date: 2014-01-07 01:55-0500\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 1191a2c59e..2b44144273 100644 --- a/l10n/templates/user_ldap.pot +++ b/l10n/templates/user_ldap.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud Core 6.0.0\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" -"POT-Creation-Date: 2014-01-06 01:55-0500\n" +"POT-Creation-Date: 2014-01-07 01:55-0500\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 4268d7b5d4..e2933b4ea6 100644 --- a/l10n/templates/user_webdavauth.pot +++ b/l10n/templates/user_webdavauth.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud Core 6.0.0\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" -"POT-Creation-Date: 2014-01-06 01:55-0500\n" +"POT-Creation-Date: 2014-01-07 01:55-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/ur/core.po b/l10n/ur/core.po new file mode 100644 index 0000000000..862ab145c3 --- /dev/null +++ b/l10n/ur/core.po @@ -0,0 +1,775 @@ +# 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: translations@owncloud.org\n" +"POT-Creation-Date: 2014-01-07 01:55-0500\n" +"PO-Revision-Date: 2014-01-06 23:45+0000\n" +"Last-Translator: I Robot\n" +"Language-Team: Urdu (http://www.transifex.com/projects/p/owncloud/language/ur/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ur\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ajax/share.php:119 ajax/share.php:198 +#, php-format +msgid "%s shared »%s« with you" +msgstr "" + +#: ajax/share.php:169 +#, php-format +msgid "Couldn't send mail to following users: %s " +msgstr "" + +#: ajax/update.php:11 +msgid "Turned on maintenance mode" +msgstr "" + +#: ajax/update.php:14 +msgid "Turned off maintenance mode" +msgstr "" + +#: ajax/update.php:17 +msgid "Updated database" +msgstr "" + +#: ajax/update.php:20 +msgid "Updating filecache, this may take really long..." +msgstr "" + +#: ajax/update.php:23 +msgid "Updated filecache" +msgstr "" + +#: ajax/update.php:26 +#, php-format +msgid "... %d%% done ..." +msgstr "" + +#: avatar/controller.php:62 +msgid "No image or file provided" +msgstr "" + +#: avatar/controller.php:81 +msgid "Unknown filetype" +msgstr "" + +#: avatar/controller.php:85 +msgid "Invalid image" +msgstr "" + +#: avatar/controller.php:115 avatar/controller.php:142 +msgid "No temporary profile picture available, try again" +msgstr "" + +#: avatar/controller.php:135 +msgid "No crop data provided" +msgstr "" + +#: js/config.php:32 +msgid "Sunday" +msgstr "" + +#: js/config.php:33 +msgid "Monday" +msgstr "" + +#: js/config.php:34 +msgid "Tuesday" +msgstr "" + +#: js/config.php:35 +msgid "Wednesday" +msgstr "" + +#: js/config.php:36 +msgid "Thursday" +msgstr "" + +#: js/config.php:37 +msgid "Friday" +msgstr "" + +#: js/config.php:38 +msgid "Saturday" +msgstr "" + +#: js/config.php:43 +msgid "January" +msgstr "" + +#: js/config.php:44 +msgid "February" +msgstr "" + +#: js/config.php:45 +msgid "March" +msgstr "" + +#: js/config.php:46 +msgid "April" +msgstr "" + +#: js/config.php:47 +msgid "May" +msgstr "" + +#: js/config.php:48 +msgid "June" +msgstr "" + +#: js/config.php:49 +msgid "July" +msgstr "" + +#: js/config.php:50 +msgid "August" +msgstr "" + +#: js/config.php:51 +msgid "September" +msgstr "" + +#: js/config.php:52 +msgid "October" +msgstr "" + +#: js/config.php:53 +msgid "November" +msgstr "" + +#: js/config.php:54 +msgid "December" +msgstr "" + +#: js/js.js:398 +msgid "Settings" +msgstr "" + +#: js/js.js:872 +msgid "seconds ago" +msgstr "" + +#: js/js.js:873 +msgid "%n minute ago" +msgid_plural "%n minutes ago" +msgstr[0] "" +msgstr[1] "" + +#: js/js.js:874 +msgid "%n hour ago" +msgid_plural "%n hours ago" +msgstr[0] "" +msgstr[1] "" + +#: js/js.js:875 +msgid "today" +msgstr "" + +#: js/js.js:876 +msgid "yesterday" +msgstr "" + +#: js/js.js:877 +msgid "%n day ago" +msgid_plural "%n days ago" +msgstr[0] "" +msgstr[1] "" + +#: js/js.js:878 +msgid "last month" +msgstr "" + +#: js/js.js:879 +msgid "%n month ago" +msgid_plural "%n months ago" +msgstr[0] "" +msgstr[1] "" + +#: js/js.js:880 +msgid "months ago" +msgstr "" + +#: js/js.js:881 +msgid "last year" +msgstr "" + +#: js/js.js:882 +msgid "years ago" +msgstr "" + +#: js/oc-dialogs.js:123 +msgid "Choose" +msgstr "" + +#: js/oc-dialogs.js:146 +msgid "Error loading file picker template: {error}" +msgstr "" + +#: js/oc-dialogs.js:172 +msgid "Yes" +msgstr "" + +#: js/oc-dialogs.js:182 +msgid "No" +msgstr "" + +#: js/oc-dialogs.js:199 +msgid "Ok" +msgstr "" + +#: js/oc-dialogs.js:219 +msgid "Error loading message template: {error}" +msgstr "" + +#: js/oc-dialogs.js:347 +msgid "{count} file conflict" +msgid_plural "{count} file conflicts" +msgstr[0] "" +msgstr[1] "" + +#: js/oc-dialogs.js:361 +msgid "One file conflict" +msgstr "" + +#: js/oc-dialogs.js:367 +msgid "Which files do you want to keep?" +msgstr "" + +#: js/oc-dialogs.js:368 +msgid "" +"If you select both versions, the copied file will have a number added to its" +" name." +msgstr "" + +#: js/oc-dialogs.js:376 +msgid "Cancel" +msgstr "" + +#: js/oc-dialogs.js:386 +msgid "Continue" +msgstr "" + +#: js/oc-dialogs.js:433 js/oc-dialogs.js:446 +msgid "(all selected)" +msgstr "" + +#: js/oc-dialogs.js:436 js/oc-dialogs.js:449 +msgid "({count} selected)" +msgstr "" + +#: js/oc-dialogs.js:457 +msgid "Error loading file exists template" +msgstr "" + +#: js/share.js:51 js/share.js:66 js/share.js:106 +msgid "Shared" +msgstr "" + +#: js/share.js:109 +msgid "Share" +msgstr "" + +#: js/share.js:158 js/share.js:171 js/share.js:178 js/share.js:707 +#: js/share.js:719 templates/installation.php:10 +msgid "Error" +msgstr "" + +#: js/share.js:160 js/share.js:747 +msgid "Error while sharing" +msgstr "" + +#: js/share.js:171 +msgid "Error while unsharing" +msgstr "" + +#: js/share.js:178 +msgid "Error while changing permissions" +msgstr "" + +#: js/share.js:187 +msgid "Shared with you and the group {group} by {owner}" +msgstr "" + +#: js/share.js:189 +msgid "Shared with you by {owner}" +msgstr "" + +#: js/share.js:213 +msgid "Share with user or group …" +msgstr "" + +#: js/share.js:219 +msgid "Share link" +msgstr "" + +#: js/share.js:222 +msgid "Password protect" +msgstr "" + +#: js/share.js:224 templates/installation.php:58 templates/login.php:38 +msgid "Password" +msgstr "" + +#: js/share.js:229 +msgid "Allow Public Upload" +msgstr "" + +#: js/share.js:233 +msgid "Email link to person" +msgstr "" + +#: js/share.js:234 +msgid "Send" +msgstr "" + +#: js/share.js:239 +msgid "Set expiration date" +msgstr "" + +#: js/share.js:240 +msgid "Expiration date" +msgstr "" + +#: js/share.js:275 +msgid "Share via email:" +msgstr "" + +#: js/share.js:278 +msgid "No people found" +msgstr "" + +#: js/share.js:322 js/share.js:359 +msgid "group" +msgstr "" + +#: js/share.js:333 +msgid "Resharing is not allowed" +msgstr "" + +#: js/share.js:375 +msgid "Shared in {item} with {user}" +msgstr "" + +#: js/share.js:397 +msgid "Unshare" +msgstr "" + +#: js/share.js:405 +msgid "notify by email" +msgstr "" + +#: js/share.js:408 +msgid "can edit" +msgstr "" + +#: js/share.js:410 +msgid "access control" +msgstr "" + +#: js/share.js:413 +msgid "create" +msgstr "" + +#: js/share.js:416 +msgid "update" +msgstr "" + +#: js/share.js:419 +msgid "delete" +msgstr "" + +#: js/share.js:422 +msgid "share" +msgstr "" + +#: js/share.js:694 +msgid "Password protected" +msgstr "" + +#: js/share.js:707 +msgid "Error unsetting expiration date" +msgstr "" + +#: js/share.js:719 +msgid "Error setting expiration date" +msgstr "" + +#: js/share.js:734 +msgid "Sending ..." +msgstr "" + +#: js/share.js:745 +msgid "Email sent" +msgstr "" + +#: js/share.js:769 +msgid "Warning" +msgstr "" + +#: js/tags.js:4 +msgid "The object type is not specified." +msgstr "" + +#: js/tags.js:13 +msgid "Enter new" +msgstr "" + +#: js/tags.js:27 +msgid "Delete" +msgstr "" + +#: js/tags.js:31 +msgid "Add" +msgstr "" + +#: js/tags.js:39 +msgid "Edit tags" +msgstr "" + +#: js/tags.js:57 +msgid "Error loading dialog template: {error}" +msgstr "" + +#: js/tags.js:261 +msgid "No tags selected for deletion." +msgstr "" + +#: js/update.js:8 +msgid "Please reload the page." +msgstr "" + +#: js/update.js:17 +msgid "" +"The update was unsuccessful. Please report this issue to the ownCloud " +"community." +msgstr "" + +#: js/update.js:21 +msgid "The update was successful. Redirecting you to ownCloud now." +msgstr "" + +#: lostpassword/controller.php:62 +#, php-format +msgid "%s password reset" +msgstr "" + +#: lostpassword/templates/email.php:2 +msgid "Use the following link to reset your password: {link}" +msgstr "" + +#: lostpassword/templates/lostpassword.php:7 +msgid "" +"The link to reset your password has been sent to your email.
If you do " +"not receive it within a reasonable amount of time, check your spam/junk " +"folders.
If it is not there ask your local administrator ." +msgstr "" + +#: lostpassword/templates/lostpassword.php:15 +msgid "Request failed!
Did you make sure your email/username was right?" +msgstr "" + +#: lostpassword/templates/lostpassword.php:18 +msgid "You will receive a link to reset your password via Email." +msgstr "" + +#: lostpassword/templates/lostpassword.php:21 templates/installation.php:52 +#: templates/login.php:31 +msgid "Username" +msgstr "" + +#: lostpassword/templates/lostpassword.php:25 +msgid "" +"Your files are encrypted. If you haven't enabled the recovery key, there " +"will be no way to get your data back after your password is reset. If you " +"are not sure what to do, please contact your administrator before you " +"continue. Do you really want to continue?" +msgstr "" + +#: lostpassword/templates/lostpassword.php:27 +msgid "Yes, I really want to reset my password now" +msgstr "" + +#: lostpassword/templates/lostpassword.php:30 +msgid "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 templates/layout.user.php:111 +msgid "Apps" +msgstr "" + +#: strings.php:8 +msgid "Admin" +msgstr "" + +#: strings.php:9 +msgid "Help" +msgstr "" + +#: tags/controller.php:22 +msgid "Error loading tags" +msgstr "" + +#: tags/controller.php:48 +msgid "Tag already exists" +msgstr "" + +#: tags/controller.php:64 +msgid "Error deleting tag(s)" +msgstr "" + +#: tags/controller.php:75 +msgid "Error tagging" +msgstr "" + +#: tags/controller.php:86 +msgid "Error untagging" +msgstr "" + +#: tags/controller.php:97 +msgid "Error favoriting" +msgstr "" + +#: tags/controller.php:108 +msgid "Error unfavoriting" +msgstr "" + +#: templates/403.php:12 +msgid "Access forbidden" +msgstr "" + +#: templates/404.php:15 +msgid "Cloud not found" +msgstr "" + +#: templates/altmail.php:2 +#, php-format +msgid "" +"Hey there,\n" +"\n" +"just letting you know that %s shared %s with you.\n" +"View it: %s\n" +"\n" +msgstr "" + +#: templates/altmail.php:4 templates/mail.php:17 +#, php-format +msgid "The share will expire on %s." +msgstr "" + +#: templates/altmail.php:7 templates/mail.php:20 +msgid "Cheers!" +msgstr "" + +#: templates/installation.php:25 templates/installation.php:32 +#: templates/installation.php:39 +msgid "Security Warning" +msgstr "" + +#: templates/installation.php:26 +msgid "Your PHP version is vulnerable to the NULL Byte attack (CVE-2006-7243)" +msgstr "" + +#: templates/installation.php:27 +#, php-format +msgid "Please update your PHP installation to use %s securely." +msgstr "" + +#: templates/installation.php:33 +msgid "" +"No secure random number generator is available, please enable the PHP " +"OpenSSL extension." +msgstr "" + +#: templates/installation.php:34 +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:40 +msgid "" +"Your data directory and files are probably accessible from the internet " +"because the .htaccess file does not work." +msgstr "" + +#: templates/installation.php:42 +#, php-format +msgid "" +"For information how to properly configure your server, please see the documentation." +msgstr "" + +#: templates/installation.php:48 +msgid "Create an admin account" +msgstr "" + +#: templates/installation.php:67 +msgid "Advanced" +msgstr "" + +#: templates/installation.php:74 +msgid "Data folder" +msgstr "" + +#: templates/installation.php:86 +msgid "Configure the database" +msgstr "" + +#: templates/installation.php:91 templates/installation.php:103 +#: templates/installation.php:114 templates/installation.php:125 +#: templates/installation.php:137 +msgid "will be used" +msgstr "" + +#: templates/installation.php:149 +msgid "Database user" +msgstr "" + +#: templates/installation.php:156 +msgid "Database password" +msgstr "" + +#: templates/installation.php:161 +msgid "Database name" +msgstr "" + +#: templates/installation.php:169 +msgid "Database tablespace" +msgstr "" + +#: templates/installation.php:176 +msgid "Database host" +msgstr "" + +#: templates/installation.php:185 +msgid "Finish setup" +msgstr "" + +#: templates/installation.php:185 +msgid "Finishing …" +msgstr "" + +#: templates/layout.user.php:40 +msgid "" +"This application requires JavaScript to be enabled for correct operation. " +"Please enable " +"JavaScript and re-load this interface." +msgstr "" + +#: templates/layout.user.php:44 +#, php-format +msgid "%s is available. Get more information on how to update." +msgstr "" + +#: templates/layout.user.php:72 templates/singleuser.user.php:8 +msgid "Log out" +msgstr "" + +#: templates/login.php:9 +msgid "Automatic logon rejected!" +msgstr "" + +#: templates/login.php:10 +msgid "" +"If you did not change your password recently, your account may be " +"compromised!" +msgstr "" + +#: templates/login.php:12 +msgid "Please change your password to secure your account again." +msgstr "" + +#: templates/login.php:17 +msgid "Server side authentication failed!" +msgstr "" + +#: templates/login.php:18 +msgid "Please contact your administrator." +msgstr "" + +#: templates/login.php:44 +msgid "Lost your password?" +msgstr "" + +#: templates/login.php:49 +msgid "remember" +msgstr "" + +#: templates/login.php:52 +msgid "Log in" +msgstr "" + +#: templates/login.php:58 +msgid "Alternative Logins" +msgstr "" + +#: templates/mail.php:15 +#, php-format +msgid "" +"Hey there,

just letting you know that %s shared »%s« with you.
View it!

" +msgstr "" + +#: templates/singleuser.user.php:3 +msgid "This ownCloud instance is currently in single user mode." +msgstr "" + +#: templates/singleuser.user.php:4 +msgid "This means only administrators can use the instance." +msgstr "" + +#: templates/singleuser.user.php:5 templates/update.user.php:5 +msgid "" +"Contact your system administrator if this message persists or appeared " +"unexpectedly." +msgstr "" + +#: templates/singleuser.user.php:7 templates/update.user.php:6 +msgid "Thank you for your patience." +msgstr "" + +#: templates/update.admin.php:3 +#, php-format +msgid "Updating ownCloud to version %s, this may take a while." +msgstr "" + +#: templates/update.user.php:3 +msgid "" +"This ownCloud instance is currently being updated, which may take a while." +msgstr "" + +#: templates/update.user.php:4 +msgid "Please reload this page after a short time to continue using ownCloud." +msgstr "" diff --git a/l10n/ur/files.po b/l10n/ur/files.po new file mode 100644 index 0000000000..ecfa869763 --- /dev/null +++ b/l10n/ur/files.po @@ -0,0 +1,413 @@ +# 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: translations@owncloud.org\n" +"POT-Creation-Date: 2014-01-07 01:55-0500\n" +"PO-Revision-Date: 2014-01-06 23:45+0000\n" +"Last-Translator: I Robot\n" +"Language-Team: Urdu (http://www.transifex.com/projects/p/owncloud/language/ur/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ur\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ajax/move.php:17 +#, php-format +msgid "Could not move %s - File with this name already exists" +msgstr "" + +#: ajax/move.php:27 ajax/move.php:30 +#, php-format +msgid "Could not move %s" +msgstr "" + +#: ajax/newfile.php:56 js/files.js:74 +msgid "File name cannot be empty." +msgstr "" + +#: ajax/newfile.php:62 +msgid "File name must not contain \"/\". Please choose a different name." +msgstr "" + +#: ajax/newfile.php:72 ajax/newfolder.php:37 lib/app.php:67 +#, php-format +msgid "" +"The name %s is already used in the folder %s. Please choose a different " +"name." +msgstr "" + +#: ajax/newfile.php:81 +msgid "Not a valid source" +msgstr "" + +#: ajax/newfile.php:86 +msgid "" +"Server is not allowed to open URLs, please check the server configuration" +msgstr "" + +#: ajax/newfile.php:103 +#, php-format +msgid "Error while downloading %s to %s" +msgstr "" + +#: ajax/newfile.php:140 +msgid "Error when creating the file" +msgstr "" + +#: ajax/newfolder.php:21 +msgid "Folder name cannot be empty." +msgstr "" + +#: ajax/newfolder.php:27 +msgid "Folder name must not contain \"/\". Please choose a different name." +msgstr "" + +#: ajax/newfolder.php:56 +msgid "Error when creating the folder" +msgstr "" + +#: ajax/upload.php:18 ajax/upload.php:50 +msgid "Unable to set upload directory." +msgstr "" + +#: ajax/upload.php:27 +msgid "Invalid Token" +msgstr "" + +#: ajax/upload.php:64 +msgid "No file was uploaded. Unknown error" +msgstr "" + +#: ajax/upload.php:71 +msgid "There is no error, the file uploaded with success" +msgstr "" + +#: ajax/upload.php:72 +msgid "" +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " +msgstr "" + +#: ajax/upload.php:74 +msgid "" +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " +"the HTML form" +msgstr "" + +#: ajax/upload.php:75 +msgid "The uploaded file was only partially uploaded" +msgstr "" + +#: ajax/upload.php:76 +msgid "No file was uploaded" +msgstr "" + +#: ajax/upload.php:77 +msgid "Missing a temporary folder" +msgstr "" + +#: ajax/upload.php:78 +msgid "Failed to write to disk" +msgstr "" + +#: ajax/upload.php:96 +msgid "Not enough storage available" +msgstr "" + +#: ajax/upload.php:127 ajax/upload.php:154 +msgid "Upload failed. Could not get file info." +msgstr "" + +#: ajax/upload.php:144 +msgid "Upload failed. Could not find uploaded file" +msgstr "" + +#: ajax/upload.php:172 +msgid "Invalid directory." +msgstr "" + +#: appinfo/app.php:11 +msgid "Files" +msgstr "" + +#: js/file-upload.js:228 +msgid "Unable to upload {filename} as it is a directory or has 0 bytes" +msgstr "" + +#: js/file-upload.js:239 +msgid "Not enough space available" +msgstr "" + +#: js/file-upload.js:306 +msgid "Upload cancelled." +msgstr "" + +#: js/file-upload.js:344 +msgid "Could not get result from server." +msgstr "" + +#: js/file-upload.js:436 +msgid "" +"File upload is in progress. Leaving the page now will cancel the upload." +msgstr "" + +#: js/file-upload.js:523 +msgid "URL cannot be empty" +msgstr "" + +#: js/file-upload.js:527 js/filelist.js:377 +msgid "In the home folder 'Shared' is a reserved filename" +msgstr "" + +#: js/file-upload.js:529 js/filelist.js:379 +msgid "{new_name} already exists" +msgstr "" + +#: js/file-upload.js:595 +msgid "Could not create file" +msgstr "" + +#: js/file-upload.js:611 +msgid "Could not create folder" +msgstr "" + +#: js/file-upload.js:661 +msgid "Error fetching URL" +msgstr "" + +#: js/fileactions.js:125 +msgid "Share" +msgstr "" + +#: js/fileactions.js:137 +msgid "Delete permanently" +msgstr "" + +#: js/fileactions.js:194 +msgid "Rename" +msgstr "" + +#: js/filelist.js:69 js/filelist.js:72 js/filelist.js:889 +msgid "Pending" +msgstr "" + +#: js/filelist.js:405 +msgid "Could not rename file" +msgstr "" + +#: js/filelist.js:539 +msgid "replaced {new_name} with {old_name}" +msgstr "" + +#: js/filelist.js:539 +msgid "undo" +msgstr "" + +#: js/filelist.js:591 +msgid "Error deleting file." +msgstr "" + +#: js/filelist.js:609 js/filelist.js:683 js/files.js:631 +msgid "%n folder" +msgid_plural "%n folders" +msgstr[0] "" +msgstr[1] "" + +#: js/filelist.js:610 js/filelist.js:684 js/files.js:637 +msgid "%n file" +msgid_plural "%n files" +msgstr[0] "" +msgstr[1] "" + +#: js/filelist.js:617 +msgid "{dirs} and {files}" +msgstr "" + +#: js/filelist.js:828 js/filelist.js:866 +msgid "Uploading %n file" +msgid_plural "Uploading %n files" +msgstr[0] "" +msgstr[1] "" + +#: js/files.js:72 +msgid "'.' is an invalid file name." +msgstr "" + +#: js/files.js:81 +msgid "" +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not " +"allowed." +msgstr "" + +#: js/files.js:93 +msgid "Your storage is full, files can not be updated or synced anymore!" +msgstr "" + +#: js/files.js:97 +msgid "Your storage is almost full ({usedSpacePercent}%)" +msgstr "" + +#: js/files.js:110 +msgid "" +"Encryption App is enabled but your keys are not initialized, please log-out " +"and log-in again" +msgstr "" + +#: js/files.js:114 +msgid "" +"Invalid private key for Encryption App. Please update your private key " +"password in your personal settings to recover access to your encrypted " +"files." +msgstr "" + +#: js/files.js:118 +msgid "" +"Encryption was disabled but your files are still encrypted. Please go to " +"your personal settings to decrypt your files." +msgstr "" + +#: js/files.js:349 +msgid "" +"Your download is being prepared. This might take some time if the files are " +"big." +msgstr "" + +#: js/files.js:558 js/files.js:596 +msgid "Error moving file" +msgstr "" + +#: js/files.js:558 js/files.js:596 +msgid "Error" +msgstr "" + +#: js/files.js:613 templates/index.php:56 +msgid "Name" +msgstr "" + +#: js/files.js:614 templates/index.php:68 +msgid "Size" +msgstr "" + +#: js/files.js:615 templates/index.php:70 +msgid "Modified" +msgstr "" + +#: lib/app.php:60 +msgid "Invalid folder name. Usage of 'Shared' is reserved." +msgstr "" + +#: lib/app.php:101 +#, php-format +msgid "%s could not be renamed" +msgstr "" + +#: lib/helper.php:11 templates/index.php:16 +msgid "Upload" +msgstr "" + +#: templates/admin.php:5 +msgid "File handling" +msgstr "" + +#: templates/admin.php:7 +msgid "Maximum upload size" +msgstr "" + +#: templates/admin.php:10 +msgid "max. possible: " +msgstr "" + +#: templates/admin.php:15 +msgid "Needed for multi-file and folder downloads." +msgstr "" + +#: templates/admin.php:17 +msgid "Enable ZIP-download" +msgstr "" + +#: templates/admin.php:20 +msgid "0 is unlimited" +msgstr "" + +#: templates/admin.php:22 +msgid "Maximum input size for ZIP files" +msgstr "" + +#: templates/admin.php:26 +msgid "Save" +msgstr "" + +#: templates/index.php:5 +msgid "New" +msgstr "" + +#: templates/index.php:8 +msgid "New text file" +msgstr "" + +#: templates/index.php:8 +msgid "Text file" +msgstr "" + +#: templates/index.php:10 +msgid "New folder" +msgstr "" + +#: templates/index.php:10 +msgid "Folder" +msgstr "" + +#: templates/index.php:12 +msgid "From link" +msgstr "" + +#: templates/index.php:29 +msgid "Deleted files" +msgstr "" + +#: templates/index.php:34 +msgid "Cancel upload" +msgstr "" + +#: templates/index.php:40 +msgid "You don’t have permission to upload or create files here" +msgstr "" + +#: templates/index.php:45 +msgid "Nothing in here. Upload something!" +msgstr "" + +#: templates/index.php:62 +msgid "Download" +msgstr "" + +#: templates/index.php:73 templates/index.php:74 +msgid "Delete" +msgstr "" + +#: templates/index.php:86 +msgid "Upload too large" +msgstr "" + +#: templates/index.php:88 +msgid "" +"The files you are trying to upload exceed the maximum size for file uploads " +"on this server." +msgstr "" + +#: templates/index.php:93 +msgid "Files are being scanned, please wait." +msgstr "" + +#: templates/index.php:96 +msgid "Current scanning" +msgstr "" + +#: templates/upgrade.php:2 +msgid "Upgrading filesystem cache..." +msgstr "" diff --git a/l10n/ur/files_encryption.po b/l10n/ur/files_encryption.po new file mode 100644 index 0000000000..3e4b7ec4a7 --- /dev/null +++ b/l10n/ur/files_encryption.po @@ -0,0 +1,201 @@ +# 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: translations@owncloud.org\n" +"POT-Creation-Date: 2014-01-07 01:55-0500\n" +"PO-Revision-Date: 2014-01-06 23:45+0000\n" +"Last-Translator: I Robot\n" +"Language-Team: Urdu (http://www.transifex.com/projects/p/owncloud/language/ur/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ur\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ajax/adminrecovery.php:29 +msgid "Recovery key successfully enabled" +msgstr "" + +#: ajax/adminrecovery.php:34 +msgid "" +"Could not enable recovery key. Please check your recovery key password!" +msgstr "" + +#: ajax/adminrecovery.php:48 +msgid "Recovery key successfully disabled" +msgstr "" + +#: ajax/adminrecovery.php:53 +msgid "" +"Could not disable recovery key. Please check your recovery key password!" +msgstr "" + +#: ajax/changeRecoveryPassword.php:49 +msgid "Password successfully changed." +msgstr "" + +#: ajax/changeRecoveryPassword.php:51 +msgid "Could not change the password. Maybe the old password was not correct." +msgstr "" + +#: ajax/updatePrivateKeyPassword.php:52 +msgid "Private key password successfully updated." +msgstr "" + +#: ajax/updatePrivateKeyPassword.php:54 +msgid "" +"Could not update the private key password. Maybe the old password was not " +"correct." +msgstr "" + +#: files/error.php:12 +msgid "" +"Encryption app not initialized! Maybe the encryption app was re-enabled " +"during your session. Please try to log out and log back in to initialize the" +" encryption app." +msgstr "" + +#: files/error.php:16 +#, php-format +msgid "" +"Your private key is not valid! Likely your password was changed outside of " +"%s (e.g. your corporate directory). You can update your private key password" +" in your personal settings to recover access to your encrypted files." +msgstr "" + +#: files/error.php:19 +msgid "" +"Can not decrypt this file, probably this is a shared file. Please ask the " +"file owner to reshare the file with you." +msgstr "" + +#: files/error.php:22 files/error.php:27 +msgid "" +"Unknown error please check your system settings or contact your " +"administrator" +msgstr "" + +#: hooks/hooks.php:62 +msgid "Missing requirements." +msgstr "" + +#: hooks/hooks.php:63 +msgid "" +"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL " +"together with the PHP extension is enabled and configured properly. For now," +" the encryption app has been disabled." +msgstr "" + +#: hooks/hooks.php:281 +msgid "Following users are not set up for encryption:" +msgstr "" + +#: js/detect-migration.js:21 +msgid "Initial encryption started... This can take some time. Please wait." +msgstr "" + +#: js/settings-admin.js:13 +msgid "Saving..." +msgstr "" + +#: templates/invalid_private_key.php:8 +msgid "Go directly to your " +msgstr "" + +#: templates/invalid_private_key.php:8 +msgid "personal settings" +msgstr "" + +#: templates/settings-admin.php:4 templates/settings-personal.php:3 +msgid "Encryption" +msgstr "" + +#: templates/settings-admin.php:7 +msgid "" +"Enable recovery key (allow to recover users files in case of password loss):" +msgstr "" + +#: templates/settings-admin.php:11 +msgid "Recovery key password" +msgstr "" + +#: templates/settings-admin.php:14 +msgid "Repeat Recovery key password" +msgstr "" + +#: templates/settings-admin.php:21 templates/settings-personal.php:51 +msgid "Enabled" +msgstr "" + +#: templates/settings-admin.php:29 templates/settings-personal.php:59 +msgid "Disabled" +msgstr "" + +#: templates/settings-admin.php:34 +msgid "Change recovery key password:" +msgstr "" + +#: templates/settings-admin.php:40 +msgid "Old Recovery key password" +msgstr "" + +#: templates/settings-admin.php:47 +msgid "New Recovery key password" +msgstr "" + +#: templates/settings-admin.php:53 +msgid "Repeat New Recovery key password" +msgstr "" + +#: templates/settings-admin.php:58 +msgid "Change Password" +msgstr "" + +#: templates/settings-personal.php:9 +msgid "Your private key password no longer match your log-in password:" +msgstr "" + +#: templates/settings-personal.php:12 +msgid "Set your old private key password to your current log-in password." +msgstr "" + +#: templates/settings-personal.php:14 +msgid "" +" If you don't remember your old password you can ask your administrator to " +"recover your files." +msgstr "" + +#: templates/settings-personal.php:22 +msgid "Old log-in password" +msgstr "" + +#: templates/settings-personal.php:28 +msgid "Current log-in password" +msgstr "" + +#: templates/settings-personal.php:33 +msgid "Update Private Key Password" +msgstr "" + +#: templates/settings-personal.php:42 +msgid "Enable password recovery:" +msgstr "" + +#: templates/settings-personal.php:44 +msgid "" +"Enabling this option will allow you to reobtain access to your encrypted " +"files in case of password loss" +msgstr "" + +#: templates/settings-personal.php:60 +msgid "File recovery settings updated" +msgstr "" + +#: templates/settings-personal.php:61 +msgid "Could not update file recovery" +msgstr "" diff --git a/l10n/ur/files_external.po b/l10n/ur/files_external.po new file mode 100644 index 0000000000..480a799b4e --- /dev/null +++ b/l10n/ur/files_external.po @@ -0,0 +1,123 @@ +# 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: translations@owncloud.org\n" +"POT-Creation-Date: 2014-01-07 01:55-0500\n" +"PO-Revision-Date: 2014-01-06 23:45+0000\n" +"Last-Translator: I Robot\n" +"Language-Team: Urdu (http://www.transifex.com/projects/p/owncloud/language/ur/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ur\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: js/dropbox.js:7 js/dropbox.js:28 js/google.js:8 js/google.js:39 +msgid "Access granted" +msgstr "" + +#: js/dropbox.js:30 js/dropbox.js:96 js/dropbox.js:102 +msgid "Error configuring Dropbox storage" +msgstr "" + +#: js/dropbox.js:65 js/google.js:86 +msgid "Grant access" +msgstr "" + +#: js/dropbox.js:101 +msgid "Please provide a valid Dropbox app key and secret." +msgstr "" + +#: js/google.js:42 js/google.js:121 +msgid "Error configuring Google Drive storage" +msgstr "" + +#: lib/config.php:467 +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:471 +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 "" + +#: lib/config.php:474 +msgid "" +"Warning: The Curl support in PHP is not enabled or installed. " +"Mounting of ownCloud / WebDAV or GoogleDrive is not possible. Please ask " +"your system administrator to install it." +msgstr "" + +#: templates/settings.php:3 +msgid "External Storage" +msgstr "" + +#: templates/settings.php:9 templates/settings.php:28 +msgid "Folder name" +msgstr "" + +#: templates/settings.php:10 +msgid "External storage" +msgstr "" + +#: templates/settings.php:11 +msgid "Configuration" +msgstr "" + +#: templates/settings.php:12 +msgid "Options" +msgstr "" + +#: templates/settings.php:13 +msgid "Applicable" +msgstr "" + +#: templates/settings.php:33 +msgid "Add storage" +msgstr "" + +#: templates/settings.php:90 +msgid "None set" +msgstr "" + +#: templates/settings.php:91 +msgid "All Users" +msgstr "" + +#: templates/settings.php:92 +msgid "Groups" +msgstr "" + +#: templates/settings.php:100 +msgid "Users" +msgstr "" + +#: templates/settings.php:113 templates/settings.php:114 +#: templates/settings.php:149 templates/settings.php:150 +msgid "Delete" +msgstr "" + +#: templates/settings.php:129 +msgid "Enable User External Storage" +msgstr "" + +#: templates/settings.php:130 +msgid "Allow users to mount their own external storage" +msgstr "" + +#: templates/settings.php:141 +msgid "SSL root certificates" +msgstr "" + +#: templates/settings.php:159 +msgid "Import Root Certificate" +msgstr "" diff --git a/l10n/ur/files_sharing.po b/l10n/ur/files_sharing.po new file mode 100644 index 0000000000..1dd85cf47f --- /dev/null +++ b/l10n/ur/files_sharing.po @@ -0,0 +1,84 @@ +# 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: translations@owncloud.org\n" +"POT-Creation-Date: 2014-01-07 01:55-0500\n" +"PO-Revision-Date: 2014-01-06 23:45+0000\n" +"Last-Translator: I Robot\n" +"Language-Team: Urdu (http://www.transifex.com/projects/p/owncloud/language/ur/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ur\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: templates/authenticate.php:4 +msgid "This share is password-protected" +msgstr "" + +#: templates/authenticate.php:7 +msgid "The password is wrong. Try again." +msgstr "" + +#: templates/authenticate.php:10 +msgid "Password" +msgstr "" + +#: templates/part.404.php:3 +msgid "Sorry, this link doesn’t seem to work anymore." +msgstr "" + +#: templates/part.404.php:4 +msgid "Reasons might be:" +msgstr "" + +#: templates/part.404.php:6 +msgid "the item was removed" +msgstr "" + +#: templates/part.404.php:7 +msgid "the link expired" +msgstr "" + +#: templates/part.404.php:8 +msgid "sharing is disabled" +msgstr "" + +#: templates/part.404.php:10 +msgid "For more info, please ask the person who sent this link." +msgstr "" + +#: templates/public.php:18 +#, php-format +msgid "%s shared the folder %s with you" +msgstr "" + +#: templates/public.php:21 +#, php-format +msgid "%s shared the file %s with you" +msgstr "" + +#: templates/public.php:29 templates/public.php:95 +msgid "Download" +msgstr "" + +#: templates/public.php:46 templates/public.php:49 +msgid "Upload" +msgstr "" + +#: templates/public.php:59 +msgid "Cancel upload" +msgstr "" + +#: templates/public.php:92 +msgid "No preview available for" +msgstr "" + +#: templates/public.php:99 +msgid "Direct link" +msgstr "" diff --git a/l10n/ur/files_trashbin.po b/l10n/ur/files_trashbin.po new file mode 100644 index 0000000000..d1b08db59f --- /dev/null +++ b/l10n/ur/files_trashbin.po @@ -0,0 +1,60 @@ +# 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: translations@owncloud.org\n" +"POT-Creation-Date: 2014-01-07 01:55-0500\n" +"PO-Revision-Date: 2014-01-06 23:45+0000\n" +"Last-Translator: I Robot\n" +"Language-Team: Urdu (http://www.transifex.com/projects/p/owncloud/language/ur/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ur\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ajax/delete.php:63 +#, php-format +msgid "Couldn't delete %s permanently" +msgstr "" + +#: ajax/undelete.php:43 +#, php-format +msgid "Couldn't restore %s" +msgstr "" + +#: js/trash.js:18 js/trash.js:45 js/trash.js:88 js/trash.js:142 +msgid "Error" +msgstr "" + +#: lib/trashbin.php:905 lib/trashbin.php:907 +msgid "restored" +msgstr "" + +#: templates/index.php:7 +msgid "Nothing in here. Your trash bin is empty!" +msgstr "" + +#: templates/index.php:20 +msgid "Name" +msgstr "" + +#: templates/index.php:23 templates/index.php:25 +msgid "Restore" +msgstr "" + +#: templates/index.php:31 +msgid "Deleted" +msgstr "" + +#: templates/index.php:34 templates/index.php:35 +msgid "Delete" +msgstr "" + +#: templates/part.breadcrumb.php:8 +msgid "Deleted Files" +msgstr "" diff --git a/l10n/ur/files_versions.po b/l10n/ur/files_versions.po new file mode 100644 index 0000000000..377d24db42 --- /dev/null +++ b/l10n/ur/files_versions.po @@ -0,0 +1,43 @@ +# 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: translations@owncloud.org\n" +"POT-Creation-Date: 2014-01-07 01:55-0500\n" +"PO-Revision-Date: 2014-01-06 23:45+0000\n" +"Last-Translator: I Robot\n" +"Language-Team: Urdu (http://www.transifex.com/projects/p/owncloud/language/ur/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ur\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ajax/rollbackVersion.php:13 +#, php-format +msgid "Could not revert: %s" +msgstr "" + +#: js/versions.js:14 +msgid "Versions" +msgstr "" + +#: js/versions.js:60 +msgid "Failed to revert {file} to revision {timestamp}." +msgstr "" + +#: js/versions.js:86 +msgid "More versions..." +msgstr "" + +#: js/versions.js:123 +msgid "No other versions available" +msgstr "" + +#: js/versions.js:154 +msgid "Restore" +msgstr "" diff --git a/l10n/ur/lib.po b/l10n/ur/lib.po new file mode 100644 index 0000000000..ba1af659a1 --- /dev/null +++ b/l10n/ur/lib.po @@ -0,0 +1,333 @@ +# 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: translations@owncloud.org\n" +"POT-Creation-Date: 2014-01-07 01:55-0500\n" +"PO-Revision-Date: 2014-01-06 23:45+0000\n" +"Last-Translator: I Robot\n" +"Language-Team: Urdu (http://www.transifex.com/projects/p/owncloud/language/ur/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ur\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: private/app.php:245 +#, php-format +msgid "" +"App \"%s\" can't be installed because it is not compatible with this version" +" of ownCloud." +msgstr "" + +#: private/app.php:257 +msgid "No app name specified" +msgstr "" + +#: private/app.php:362 +msgid "Help" +msgstr "" + +#: private/app.php:375 +msgid "Personal" +msgstr "" + +#: private/app.php:386 +msgid "Settings" +msgstr "" + +#: private/app.php:398 +msgid "Users" +msgstr "" + +#: private/app.php:411 +msgid "Admin" +msgstr "" + +#: private/app.php:875 +#, php-format +msgid "Failed to upgrade \"%s\"." +msgstr "" + +#: private/avatar.php:66 +msgid "Unknown filetype" +msgstr "" + +#: private/avatar.php:71 +msgid "Invalid image" +msgstr "" + +#: private/defaults.php:34 +msgid "web services under your control" +msgstr "" + +#: private/files.php:66 private/files.php:98 +#, php-format +msgid "cannot open \"%s\"" +msgstr "" + +#: private/files.php:231 +msgid "ZIP download is turned off." +msgstr "" + +#: private/files.php:232 +msgid "Files need to be downloaded one by one." +msgstr "" + +#: private/files.php:233 private/files.php:261 +msgid "Back to Files" +msgstr "" + +#: private/files.php:258 +msgid "Selected files too large to generate zip file." +msgstr "" + +#: private/files.php:259 +msgid "" +"Please download the files separately in smaller chunks or kindly ask your " +"administrator." +msgstr "" + +#: private/installer.php:63 +msgid "No source specified when installing app" +msgstr "" + +#: private/installer.php:70 +msgid "No href specified when installing app from http" +msgstr "" + +#: private/installer.php:75 +msgid "No path specified when installing app from local file" +msgstr "" + +#: private/installer.php:89 +#, php-format +msgid "Archives of type %s are not supported" +msgstr "" + +#: private/installer.php:103 +msgid "Failed to open archive when installing app" +msgstr "" + +#: private/installer.php:125 +msgid "App does not provide an info.xml file" +msgstr "" + +#: private/installer.php:131 +msgid "App can't be installed because of not allowed code in the App" +msgstr "" + +#: private/installer.php:140 +msgid "" +"App can't be installed because it is not compatible with this version of " +"ownCloud" +msgstr "" + +#: private/installer.php:146 +msgid "" +"App can't be installed because it contains the true tag " +"which is not allowed for non shipped apps" +msgstr "" + +#: private/installer.php:159 +msgid "" +"App can't be installed because the version in info.xml/version is not the " +"same as the version reported from the app store" +msgstr "" + +#: private/installer.php:169 +msgid "App directory already exists" +msgstr "" + +#: private/installer.php:182 +#, php-format +msgid "Can't create app folder. Please fix permissions. %s" +msgstr "" + +#: private/json.php:28 +msgid "Application is not enabled" +msgstr "" + +#: private/json.php:39 private/json.php:62 private/json.php:73 +msgid "Authentication error" +msgstr "" + +#: private/json.php:51 +msgid "Token expired. Please reload page." +msgstr "" + +#: private/search/provider/file.php:18 private/search/provider/file.php:36 +msgid "Files" +msgstr "" + +#: private/search/provider/file.php:27 private/search/provider/file.php:34 +msgid "Text" +msgstr "" + +#: private/search/provider/file.php:30 +msgid "Images" +msgstr "" + +#: private/setup/abstractdatabase.php:26 +#, php-format +msgid "%s enter the database username." +msgstr "" + +#: private/setup/abstractdatabase.php:29 +#, php-format +msgid "%s enter the database name." +msgstr "" + +#: private/setup/abstractdatabase.php:32 +#, php-format +msgid "%s you may not use dots in the database name" +msgstr "" + +#: private/setup/mssql.php:20 +#, php-format +msgid "MS SQL username and/or password not valid: %s" +msgstr "" + +#: private/setup/mssql.php:21 private/setup/mysql.php:13 +#: private/setup/oci.php:114 private/setup/postgresql.php:24 +#: private/setup/postgresql.php:70 +msgid "You need to enter either an existing account or the administrator." +msgstr "" + +#: private/setup/mysql.php:12 +msgid "MySQL username and/or password not valid" +msgstr "" + +#: private/setup/mysql.php:67 private/setup/oci.php:54 +#: private/setup/oci.php:121 private/setup/oci.php:144 +#: private/setup/oci.php:151 private/setup/oci.php:162 +#: private/setup/oci.php:169 private/setup/oci.php:178 +#: private/setup/oci.php:186 private/setup/oci.php:195 +#: private/setup/oci.php:201 private/setup/postgresql.php:89 +#: private/setup/postgresql.php:98 private/setup/postgresql.php:115 +#: private/setup/postgresql.php:125 private/setup/postgresql.php:134 +#, php-format +msgid "DB Error: \"%s\"" +msgstr "" + +#: private/setup/mysql.php:68 private/setup/oci.php:55 +#: private/setup/oci.php:122 private/setup/oci.php:145 +#: private/setup/oci.php:152 private/setup/oci.php:163 +#: private/setup/oci.php:179 private/setup/oci.php:187 +#: private/setup/oci.php:196 private/setup/postgresql.php:90 +#: private/setup/postgresql.php:99 private/setup/postgresql.php:116 +#: private/setup/postgresql.php:126 private/setup/postgresql.php:135 +#, php-format +msgid "Offending command was: \"%s\"" +msgstr "" + +#: private/setup/mysql.php:85 +#, php-format +msgid "MySQL user '%s'@'localhost' exists already." +msgstr "" + +#: private/setup/mysql.php:86 +msgid "Drop this user from MySQL" +msgstr "" + +#: private/setup/mysql.php:91 +#, php-format +msgid "MySQL user '%s'@'%%' already exists" +msgstr "" + +#: private/setup/mysql.php:92 +msgid "Drop this user from MySQL." +msgstr "" + +#: private/setup/oci.php:34 +msgid "Oracle connection could not be established" +msgstr "" + +#: private/setup/oci.php:41 private/setup/oci.php:113 +msgid "Oracle username and/or password not valid" +msgstr "" + +#: private/setup/oci.php:170 private/setup/oci.php:202 +#, php-format +msgid "Offending command was: \"%s\", name: %s, password: %s" +msgstr "" + +#: private/setup/postgresql.php:23 private/setup/postgresql.php:69 +msgid "PostgreSQL username and/or password not valid" +msgstr "" + +#: private/setup.php:28 +msgid "Set an admin username." +msgstr "" + +#: private/setup.php:31 +msgid "Set an admin password." +msgstr "" + +#: private/setup.php:195 +msgid "" +"Your web server is not yet properly setup to allow files synchronization " +"because the WebDAV interface seems to be broken." +msgstr "" + +#: private/setup.php:196 +#, php-format +msgid "Please double check the installation guides." +msgstr "" + +#: private/tags.php:194 +#, php-format +msgid "Could not find category \"%s\"" +msgstr "" + +#: private/template/functions.php:130 +msgid "seconds ago" +msgstr "" + +#: private/template/functions.php:131 +msgid "%n minute ago" +msgid_plural "%n minutes ago" +msgstr[0] "" +msgstr[1] "" + +#: private/template/functions.php:132 +msgid "%n hour ago" +msgid_plural "%n hours ago" +msgstr[0] "" +msgstr[1] "" + +#: private/template/functions.php:133 +msgid "today" +msgstr "" + +#: private/template/functions.php:134 +msgid "yesterday" +msgstr "" + +#: private/template/functions.php:136 +msgid "%n day go" +msgid_plural "%n days ago" +msgstr[0] "" +msgstr[1] "" + +#: private/template/functions.php:138 +msgid "last month" +msgstr "" + +#: private/template/functions.php:139 +msgid "%n month ago" +msgid_plural "%n months ago" +msgstr[0] "" +msgstr[1] "" + +#: private/template/functions.php:141 +msgid "last year" +msgstr "" + +#: private/template/functions.php:142 +msgid "years ago" +msgstr "" diff --git a/l10n/ur/settings.po b/l10n/ur/settings.po new file mode 100644 index 0000000000..f068880aa5 --- /dev/null +++ b/l10n/ur/settings.po @@ -0,0 +1,668 @@ +# 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: translations@owncloud.org\n" +"POT-Creation-Date: 2014-01-07 01:55-0500\n" +"PO-Revision-Date: 2014-01-06 23:45+0000\n" +"Last-Translator: I Robot\n" +"Language-Team: Urdu (http://www.transifex.com/projects/p/owncloud/language/ur/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ur\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ajax/apps/ocs.php:20 +msgid "Unable to load list from App Store" +msgstr "" + +#: ajax/changedisplayname.php:25 ajax/removeuser.php:15 ajax/setquota.php:17 +#: ajax/togglegroups.php:20 changepassword/controller.php:55 +msgid "Authentication error" +msgstr "" + +#: ajax/changedisplayname.php:31 +msgid "Your full name has been changed." +msgstr "" + +#: ajax/changedisplayname.php:34 +msgid "Unable to change full name" +msgstr "" + +#: ajax/creategroup.php:10 +msgid "Group already exists" +msgstr "" + +#: ajax/creategroup.php:19 +msgid "Unable to add group" +msgstr "" + +#: ajax/lostpassword.php:12 +msgid "Email saved" +msgstr "" + +#: ajax/lostpassword.php:14 +msgid "Invalid email" +msgstr "" + +#: ajax/removegroup.php:13 +msgid "Unable to delete group" +msgstr "" + +#: ajax/removeuser.php:25 +msgid "Unable to delete user" +msgstr "" + +#: ajax/setlanguage.php:15 +msgid "Language changed" +msgstr "" + +#: ajax/setlanguage.php:17 ajax/setlanguage.php:20 +msgid "Invalid request" +msgstr "" + +#: ajax/togglegroups.php:12 +msgid "Admins can't remove themself from the admin group" +msgstr "" + +#: ajax/togglegroups.php:30 +#, php-format +msgid "Unable to add user to group %s" +msgstr "" + +#: ajax/togglegroups.php:36 +#, php-format +msgid "Unable to remove user from group %s" +msgstr "" + +#: ajax/updateapp.php:14 +msgid "Couldn't update app." +msgstr "" + +#: changepassword/controller.php:20 +msgid "Wrong password" +msgstr "" + +#: changepassword/controller.php:42 +msgid "No user supplied" +msgstr "" + +#: changepassword/controller.php:74 +msgid "" +"Please provide an admin recovery password, otherwise all user data will be " +"lost" +msgstr "" + +#: changepassword/controller.php:79 +msgid "" +"Wrong admin recovery password. Please check the password and try again." +msgstr "" + +#: changepassword/controller.php:87 +msgid "" +"Back-end doesn't support password change, but the users encryption key was " +"successfully updated." +msgstr "" + +#: changepassword/controller.php:92 changepassword/controller.php:103 +msgid "Unable to change password" +msgstr "" + +#: js/apps.js:43 +msgid "Update to {appversion}" +msgstr "" + +#: js/apps.js:49 js/apps.js:82 js/apps.js:110 +msgid "Disable" +msgstr "" + +#: js/apps.js:49 js/apps.js:90 js/apps.js:103 js/apps.js:119 +msgid "Enable" +msgstr "" + +#: js/apps.js:71 +msgid "Please wait...." +msgstr "" + +#: js/apps.js:79 js/apps.js:80 js/apps.js:101 +msgid "Error while disabling app" +msgstr "" + +#: js/apps.js:100 js/apps.js:114 js/apps.js:115 +msgid "Error while enabling app" +msgstr "" + +#: js/apps.js:125 +msgid "Updating...." +msgstr "" + +#: js/apps.js:128 +msgid "Error while updating app" +msgstr "" + +#: js/apps.js:128 +msgid "Error" +msgstr "" + +#: js/apps.js:129 templates/apps.php:43 +msgid "Update" +msgstr "" + +#: js/apps.js:132 +msgid "Updated" +msgstr "" + +#: js/personal.js:220 +msgid "Select a profile picture" +msgstr "" + +#: js/personal.js:266 +msgid "Decrypting files... Please wait, this can take some time." +msgstr "" + +#: js/personal.js:287 +msgid "Saving..." +msgstr "" + +#: js/users.js:47 +msgid "deleted" +msgstr "" + +#: js/users.js:47 +msgid "undo" +msgstr "" + +#: js/users.js:79 +msgid "Unable to remove user" +msgstr "" + +#: js/users.js:95 templates/users.php:26 templates/users.php:90 +#: templates/users.php:118 +msgid "Groups" +msgstr "" + +#: js/users.js:100 templates/users.php:92 templates/users.php:130 +msgid "Group Admin" +msgstr "" + +#: js/users.js:123 templates/users.php:170 +msgid "Delete" +msgstr "" + +#: js/users.js:284 +msgid "add group" +msgstr "" + +#: js/users.js:454 +msgid "A valid username must be provided" +msgstr "" + +#: js/users.js:455 js/users.js:461 js/users.js:476 +msgid "Error creating user" +msgstr "" + +#: js/users.js:460 +msgid "A valid password must be provided" +msgstr "" + +#: js/users.js:484 +msgid "Warning: Home directory for user \"{user}\" already exists" +msgstr "" + +#: personal.php:45 personal.php:46 +msgid "__language_name__" +msgstr "" + +#: templates/admin.php:8 +msgid "Everything (fatal issues, errors, warnings, info, debug)" +msgstr "" + +#: templates/admin.php:9 +msgid "Info, warnings, errors and fatal issues" +msgstr "" + +#: templates/admin.php:10 +msgid "Warnings, errors and fatal issues" +msgstr "" + +#: templates/admin.php:11 +msgid "Errors and fatal issues" +msgstr "" + +#: templates/admin.php:12 +msgid "Fatal issues only" +msgstr "" + +#: templates/admin.php:22 templates/admin.php:36 +msgid "Security Warning" +msgstr "" + +#: templates/admin.php:25 +#, php-format +msgid "" +"You are accessing %s via HTTP. We strongly suggest you configure your server" +" to require using HTTPS instead." +msgstr "" + +#: templates/admin.php:39 +msgid "" +"Your data directory and your files are probably accessible from the " +"internet. The .htaccess file 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/admin.php:50 +msgid "Setup Warning" +msgstr "" + +#: templates/admin.php:53 +msgid "" +"Your web server is not yet properly setup to allow files synchronization " +"because the WebDAV interface seems to be broken." +msgstr "" + +#: templates/admin.php:54 +#, php-format +msgid "Please double check the installation guides." +msgstr "" + +#: templates/admin.php:65 +msgid "Module 'fileinfo' missing" +msgstr "" + +#: templates/admin.php:68 +msgid "" +"The PHP module 'fileinfo' is missing. We strongly recommend to enable this " +"module to get best results with mime-type detection." +msgstr "" + +#: templates/admin.php:79 +msgid "Your PHP version is outdated" +msgstr "" + +#: templates/admin.php:82 +msgid "" +"Your PHP version is outdated. We strongly recommend to update to 5.3.8 or " +"newer because older versions are known to be broken. It is possible that " +"this installation is not working correctly." +msgstr "" + +#: templates/admin.php:93 +msgid "Locale not working" +msgstr "" + +#: templates/admin.php:98 +msgid "System locale can not be set to a one which supports UTF-8." +msgstr "" + +#: templates/admin.php:102 +msgid "" +"This means that there might be problems with certain characters in file " +"names." +msgstr "" + +#: templates/admin.php:106 +#, php-format +msgid "" +"We strongly suggest to install the required packages on your system to " +"support one of the following locales: %s." +msgstr "" + +#: templates/admin.php:118 +msgid "Internet connection not working" +msgstr "" + +#: templates/admin.php:121 +msgid "" +"This server has no working internet connection. This means that some of the " +"features like mounting of external storage, notifications about updates or " +"installation of 3rd party apps don´t work. Accessing files from remote and " +"sending of notification emails might also not work. We suggest to enable " +"internet connection for this server if you want to have all features." +msgstr "" + +#: templates/admin.php:135 +msgid "Cron" +msgstr "" + +#: templates/admin.php:142 +msgid "Execute one task with each page loaded" +msgstr "" + +#: templates/admin.php:150 +msgid "" +"cron.php is registered at a webcron service to call cron.php every 15 " +"minutes over http." +msgstr "" + +#: templates/admin.php:158 +msgid "Use systems cron service to call the cron.php file every 15 minutes." +msgstr "" + +#: templates/admin.php:163 +msgid "Sharing" +msgstr "" + +#: templates/admin.php:169 +msgid "Enable Share API" +msgstr "" + +#: templates/admin.php:170 +msgid "Allow apps to use the Share API" +msgstr "" + +#: templates/admin.php:177 +msgid "Allow links" +msgstr "" + +#: templates/admin.php:178 +msgid "Allow users to share items to the public with links" +msgstr "" + +#: templates/admin.php:186 +msgid "Allow public uploads" +msgstr "" + +#: templates/admin.php:187 +msgid "" +"Allow users to enable others to upload into their publicly shared folders" +msgstr "" + +#: templates/admin.php:195 +msgid "Allow resharing" +msgstr "" + +#: templates/admin.php:196 +msgid "Allow users to share items shared with them again" +msgstr "" + +#: templates/admin.php:203 +msgid "Allow users to share with anyone" +msgstr "" + +#: templates/admin.php:206 +msgid "Allow users to only share with users in their groups" +msgstr "" + +#: templates/admin.php:213 +msgid "Allow mail notification" +msgstr "" + +#: templates/admin.php:214 +msgid "Allow user to send mail notification for shared files" +msgstr "" + +#: templates/admin.php:221 +msgid "Security" +msgstr "" + +#: templates/admin.php:234 +msgid "Enforce HTTPS" +msgstr "" + +#: templates/admin.php:236 +#, php-format +msgid "Forces the clients to connect to %s via an encrypted connection." +msgstr "" + +#: templates/admin.php:242 +#, php-format +msgid "" +"Please connect to your %s via HTTPS to enable or disable the SSL " +"enforcement." +msgstr "" + +#: templates/admin.php:254 +msgid "Log" +msgstr "" + +#: templates/admin.php:255 +msgid "Log level" +msgstr "" + +#: templates/admin.php:287 +msgid "More" +msgstr "" + +#: templates/admin.php:288 +msgid "Less" +msgstr "" + +#: templates/admin.php:294 templates/personal.php:173 +msgid "Version" +msgstr "" + +#: templates/admin.php:298 templates/personal.php:176 +msgid "" +"Developed by the ownCloud community, the source code is " +"licensed under the AGPL." +msgstr "" + +#: templates/apps.php:13 +msgid "Add your App" +msgstr "" + +#: templates/apps.php:28 +msgid "More Apps" +msgstr "" + +#: templates/apps.php:33 +msgid "Select an App" +msgstr "" + +#: templates/apps.php:39 +msgid "See application page at apps.owncloud.com" +msgstr "" + +#: templates/apps.php:41 +msgid "-licensed by " +msgstr "" + +#: templates/help.php:4 +msgid "User Documentation" +msgstr "" + +#: templates/help.php:6 +msgid "Administrator Documentation" +msgstr "" + +#: templates/help.php:9 +msgid "Online Documentation" +msgstr "" + +#: templates/help.php:11 +msgid "Forum" +msgstr "" + +#: templates/help.php:14 +msgid "Bugtracker" +msgstr "" + +#: templates/help.php:17 +msgid "Commercial Support" +msgstr "" + +#: templates/personal.php:8 +msgid "Get the apps to sync your files" +msgstr "" + +#: templates/personal.php:19 +msgid "Show First Run Wizard again" +msgstr "" + +#: templates/personal.php:27 +#, php-format +msgid "You have used %s of the available %s" +msgstr "" + +#: templates/personal.php:39 templates/users.php:23 templates/users.php:89 +msgid "Password" +msgstr "" + +#: templates/personal.php:40 +msgid "Your password was changed" +msgstr "" + +#: templates/personal.php:41 +msgid "Unable to change your password" +msgstr "" + +#: templates/personal.php:42 +msgid "Current password" +msgstr "" + +#: templates/personal.php:44 +msgid "New password" +msgstr "" + +#: templates/personal.php:46 +msgid "Change password" +msgstr "" + +#: templates/personal.php:58 templates/users.php:88 +msgid "Full Name" +msgstr "" + +#: templates/personal.php:73 +msgid "Email" +msgstr "" + +#: templates/personal.php:75 +msgid "Your email address" +msgstr "" + +#: templates/personal.php:76 +msgid "Fill in an email address to enable password recovery" +msgstr "" + +#: templates/personal.php:86 +msgid "Profile picture" +msgstr "" + +#: templates/personal.php:91 +msgid "Upload new" +msgstr "" + +#: templates/personal.php:93 +msgid "Select new from Files" +msgstr "" + +#: templates/personal.php:94 +msgid "Remove image" +msgstr "" + +#: templates/personal.php:95 +msgid "Either png or jpg. Ideally square but you will be able to crop it." +msgstr "" + +#: templates/personal.php:97 +msgid "Your avatar is provided by your original account." +msgstr "" + +#: templates/personal.php:101 +msgid "Abort" +msgstr "" + +#: templates/personal.php:102 +msgid "Choose as profile image" +msgstr "" + +#: templates/personal.php:110 templates/personal.php:111 +msgid "Language" +msgstr "" + +#: templates/personal.php:130 +msgid "Help translate" +msgstr "" + +#: templates/personal.php:137 +msgid "WebDAV" +msgstr "" + +#: templates/personal.php:139 +#, php-format +msgid "" +"Use this address to access your Files via " +"WebDAV" +msgstr "" + +#: templates/personal.php:150 +msgid "Encryption" +msgstr "" + +#: templates/personal.php:152 +msgid "The encryption app is no longer enabled, please decrypt all your files" +msgstr "" + +#: templates/personal.php:158 +msgid "Log-in password" +msgstr "" + +#: templates/personal.php:163 +msgid "Decrypt all Files" +msgstr "" + +#: templates/users.php:21 +msgid "Login Name" +msgstr "" + +#: templates/users.php:30 +msgid "Create" +msgstr "" + +#: templates/users.php:36 +msgid "Admin Recovery Password" +msgstr "" + +#: templates/users.php:37 templates/users.php:38 +msgid "" +"Enter the recovery password in order to recover the users files during " +"password change" +msgstr "" + +#: templates/users.php:42 +msgid "Default Storage" +msgstr "" + +#: templates/users.php:44 templates/users.php:139 +msgid "Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" +msgstr "" + +#: templates/users.php:48 templates/users.php:148 +msgid "Unlimited" +msgstr "" + +#: templates/users.php:66 templates/users.php:163 +msgid "Other" +msgstr "" + +#: templates/users.php:87 +msgid "Username" +msgstr "" + +#: templates/users.php:94 +msgid "Storage" +msgstr "" + +#: templates/users.php:108 +msgid "change full name" +msgstr "" + +#: templates/users.php:112 +msgid "set new password" +msgstr "" + +#: templates/users.php:143 +msgid "Default" +msgstr "" diff --git a/l10n/ur/user_ldap.po b/l10n/ur/user_ldap.po new file mode 100644 index 0000000000..8d5790eea9 --- /dev/null +++ b/l10n/ur/user_ldap.po @@ -0,0 +1,513 @@ +# 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: translations@owncloud.org\n" +"POT-Creation-Date: 2014-01-07 01:55-0500\n" +"PO-Revision-Date: 2014-01-06 23:45+0000\n" +"Last-Translator: I Robot\n" +"Language-Team: Urdu (http://www.transifex.com/projects/p/owncloud/language/ur/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ur\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ajax/clearMappings.php:34 +msgid "Failed to clear the mappings." +msgstr "" + +#: ajax/deleteConfiguration.php:34 +msgid "Failed to delete the server configuration" +msgstr "" + +#: ajax/testConfiguration.php:39 +msgid "The configuration is valid and the connection could be established!" +msgstr "" + +#: ajax/testConfiguration.php:42 +msgid "" +"The configuration is valid, but the Bind failed. Please check the server " +"settings and credentials." +msgstr "" + +#: ajax/testConfiguration.php:46 +msgid "" +"The configuration is invalid. Please have a look at the logs for further " +"details." +msgstr "" + +#: ajax/wizard.php:32 +msgid "No action specified" +msgstr "" + +#: ajax/wizard.php:38 +msgid "No configuration specified" +msgstr "" + +#: ajax/wizard.php:81 +msgid "No data specified" +msgstr "" + +#: ajax/wizard.php:89 +#, php-format +msgid " Could not set configuration %s" +msgstr "" + +#: js/settings.js:67 +msgid "Deletion failed" +msgstr "" + +#: js/settings.js:83 +msgid "Take over settings from recent server configuration?" +msgstr "" + +#: js/settings.js:84 +msgid "Keep settings?" +msgstr "" + +#: js/settings.js:99 +msgid "Cannot add server configuration" +msgstr "" + +#: js/settings.js:127 +msgid "mappings cleared" +msgstr "" + +#: js/settings.js:128 +msgid "Success" +msgstr "" + +#: js/settings.js:133 +msgid "Error" +msgstr "" + +#: js/settings.js:837 +msgid "Configuration OK" +msgstr "" + +#: js/settings.js:846 +msgid "Configuration incorrect" +msgstr "" + +#: js/settings.js:855 +msgid "Configuration incomplete" +msgstr "" + +#: js/settings.js:872 js/settings.js:881 +msgid "Select groups" +msgstr "" + +#: js/settings.js:875 js/settings.js:884 +msgid "Select object classes" +msgstr "" + +#: js/settings.js:878 +msgid "Select attributes" +msgstr "" + +#: js/settings.js:905 +msgid "Connection test succeeded" +msgstr "" + +#: js/settings.js:912 +msgid "Connection test failed" +msgstr "" + +#: js/settings.js:921 +msgid "Do you really want to delete the current Server Configuration?" +msgstr "" + +#: js/settings.js:922 +msgid "Confirm Deletion" +msgstr "" + +#: lib/wizard.php:79 lib/wizard.php:93 +#, php-format +msgid "%s group found" +msgid_plural "%s groups found" +msgstr[0] "" +msgstr[1] "" + +#: lib/wizard.php:122 +#, php-format +msgid "%s user found" +msgid_plural "%s users found" +msgstr[0] "" +msgstr[1] "" + +#: lib/wizard.php:778 lib/wizard.php:790 +msgid "Invalid Host" +msgstr "" + +#: lib/wizard.php:951 +msgid "Could not find the desired feature" +msgstr "" + +#: templates/part.settingcontrols.php:2 +msgid "Save" +msgstr "" + +#: templates/part.settingcontrols.php:4 +msgid "Test Configuration" +msgstr "" + +#: templates/part.settingcontrols.php:10 templates/part.wizardcontrols.php:14 +msgid "Help" +msgstr "" + +#: templates/part.wizard-groupfilter.php:4 +#, php-format +msgid "Limit the access to %s to groups meeting this criteria:" +msgstr "" + +#: templates/part.wizard-groupfilter.php:8 +#: templates/part.wizard-userfilter.php:8 +msgid "only those object classes:" +msgstr "" + +#: templates/part.wizard-groupfilter.php:17 +#: templates/part.wizard-userfilter.php:17 +msgid "only from those groups:" +msgstr "" + +#: templates/part.wizard-groupfilter.php:25 +#: templates/part.wizard-loginfilter.php:32 +#: templates/part.wizard-userfilter.php:25 +msgid "Edit raw filter instead" +msgstr "" + +#: templates/part.wizard-groupfilter.php:30 +#: templates/part.wizard-loginfilter.php:37 +#: templates/part.wizard-userfilter.php:30 +msgid "Raw LDAP filter" +msgstr "" + +#: templates/part.wizard-groupfilter.php:31 +#, php-format +msgid "" +"The filter specifies which LDAP groups shall have access to the %s instance." +msgstr "" + +#: templates/part.wizard-groupfilter.php:38 +msgid "groups found" +msgstr "" + +#: templates/part.wizard-loginfilter.php:4 +msgid "What attribute shall be used as login name:" +msgstr "" + +#: templates/part.wizard-loginfilter.php:8 +msgid "LDAP Username:" +msgstr "" + +#: templates/part.wizard-loginfilter.php:16 +msgid "LDAP Email Address:" +msgstr "" + +#: templates/part.wizard-loginfilter.php:24 +msgid "Other Attributes:" +msgstr "" + +#: templates/part.wizard-loginfilter.php:38 +#, php-format +msgid "" +"Defines the filter to apply, when login is attempted. %%uid replaces the " +"username in the login action. Example: \"uid=%%uid\"" +msgstr "" + +#: templates/part.wizard-server.php:18 +msgid "Add Server Configuration" +msgstr "" + +#: templates/part.wizard-server.php:30 +msgid "Host" +msgstr "" + +#: templates/part.wizard-server.php:31 +msgid "" +"You can omit the protocol, except you require SSL. Then start with ldaps://" +msgstr "" + +#: templates/part.wizard-server.php:36 +msgid "Port" +msgstr "" + +#: templates/part.wizard-server.php:44 +msgid "User DN" +msgstr "" + +#: templates/part.wizard-server.php:45 +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/part.wizard-server.php:52 +msgid "Password" +msgstr "" + +#: templates/part.wizard-server.php:53 +msgid "For anonymous access, leave DN and Password empty." +msgstr "" + +#: templates/part.wizard-server.php:60 +msgid "One Base DN per line" +msgstr "" + +#: templates/part.wizard-server.php:61 +msgid "You can specify Base DN for users and groups in the Advanced tab" +msgstr "" + +#: templates/part.wizard-userfilter.php:4 +#, php-format +msgid "Limit the access to %s to users meeting this criteria:" +msgstr "" + +#: templates/part.wizard-userfilter.php:31 +#, php-format +msgid "" +"The filter specifies which LDAP users shall have access to the %s instance." +msgstr "" + +#: templates/part.wizard-userfilter.php:38 +msgid "users found" +msgstr "" + +#: templates/part.wizardcontrols.php:5 +msgid "Back" +msgstr "" + +#: templates/part.wizardcontrols.php:8 +msgid "Continue" +msgstr "" + +#: templates/settings.php:11 +msgid "" +"Warning: Apps user_ldap and user_webdavauth are incompatible. You may" +" experience unexpected behavior. Please ask your system administrator to " +"disable one of them." +msgstr "" + +#: templates/settings.php:14 +msgid "" +"Warning: The PHP LDAP module is not installed, the backend will not " +"work. Please ask your system administrator to install it." +msgstr "" + +#: templates/settings.php:20 +msgid "Connection Settings" +msgstr "" + +#: templates/settings.php:22 +msgid "Configuration Active" +msgstr "" + +#: templates/settings.php:22 +msgid "When unchecked, this configuration will be skipped." +msgstr "" + +#: templates/settings.php:23 +msgid "Backup (Replica) Host" +msgstr "" + +#: templates/settings.php:23 +msgid "" +"Give an optional backup host. It must be a replica of the main LDAP/AD " +"server." +msgstr "" + +#: templates/settings.php:24 +msgid "Backup (Replica) Port" +msgstr "" + +#: templates/settings.php:25 +msgid "Disable Main Server" +msgstr "" + +#: templates/settings.php:25 +msgid "Only connect to the replica server." +msgstr "" + +#: templates/settings.php:26 +msgid "Case insensitve LDAP server (Windows)" +msgstr "" + +#: templates/settings.php:27 +msgid "Turn off SSL certificate validation." +msgstr "" + +#: templates/settings.php:27 +#, php-format +msgid "" +"Not recommended, use it for testing only! If connection only works with this" +" option, import the LDAP server's SSL certificate in your %s server." +msgstr "" + +#: templates/settings.php:28 +msgid "Cache Time-To-Live" +msgstr "" + +#: templates/settings.php:28 +msgid "in seconds. A change empties the cache." +msgstr "" + +#: templates/settings.php:30 +msgid "Directory Settings" +msgstr "" + +#: templates/settings.php:32 +msgid "User Display Name Field" +msgstr "" + +#: templates/settings.php:32 +msgid "The LDAP attribute to use to generate the user's display name." +msgstr "" + +#: templates/settings.php:33 +msgid "Base User Tree" +msgstr "" + +#: templates/settings.php:33 +msgid "One User Base DN per line" +msgstr "" + +#: templates/settings.php:34 +msgid "User Search Attributes" +msgstr "" + +#: templates/settings.php:34 templates/settings.php:37 +msgid "Optional; one attribute per line" +msgstr "" + +#: templates/settings.php:35 +msgid "Group Display Name Field" +msgstr "" + +#: templates/settings.php:35 +msgid "The LDAP attribute to use to generate the groups's display name." +msgstr "" + +#: templates/settings.php:36 +msgid "Base Group Tree" +msgstr "" + +#: templates/settings.php:36 +msgid "One Group Base DN per line" +msgstr "" + +#: templates/settings.php:37 +msgid "Group Search Attributes" +msgstr "" + +#: templates/settings.php:38 +msgid "Group-Member association" +msgstr "" + +#: templates/settings.php:40 +msgid "Special Attributes" +msgstr "" + +#: templates/settings.php:42 +msgid "Quota Field" +msgstr "" + +#: templates/settings.php:43 +msgid "Quota Default" +msgstr "" + +#: templates/settings.php:43 +msgid "in bytes" +msgstr "" + +#: templates/settings.php:44 +msgid "Email Field" +msgstr "" + +#: templates/settings.php:45 +msgid "User Home Folder Naming Rule" +msgstr "" + +#: templates/settings.php:45 +msgid "" +"Leave empty for user name (default). Otherwise, specify an LDAP/AD " +"attribute." +msgstr "" + +#: templates/settings.php:51 +msgid "Internal Username" +msgstr "" + +#: templates/settings.php:52 +msgid "" +"By default the internal username will be created from the UUID attribute. It" +" makes sure that the username is unique and characters do not need to be " +"converted. The internal username has the restriction that only these " +"characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced " +"with their ASCII correspondence or simply omitted. On collisions a number " +"will be added/increased. The internal username is used to identify a user " +"internally. It is also the default name for the user home folder. It is also" +" a part of remote URLs, for instance for all *DAV services. With this " +"setting, the default behavior can be overridden. To achieve a similar " +"behavior as before ownCloud 5 enter the user display name attribute in the " +"following field. Leave it empty for default behavior. Changes will have " +"effect only on newly mapped (added) LDAP users." +msgstr "" + +#: templates/settings.php:53 +msgid "Internal Username Attribute:" +msgstr "" + +#: templates/settings.php:54 +msgid "Override UUID detection" +msgstr "" + +#: templates/settings.php:55 +msgid "" +"By default, the UUID attribute is automatically detected. The UUID attribute" +" is used to doubtlessly identify LDAP users and groups. Also, the internal " +"username will be created based on the UUID, if not specified otherwise " +"above. You can override the setting and pass an attribute of your choice. " +"You must make sure that the attribute of your choice can be fetched for both" +" users and groups and it is unique. Leave it empty for default behavior. " +"Changes will have effect only on newly mapped (added) LDAP users and groups." +msgstr "" + +#: templates/settings.php:56 +msgid "UUID Attribute for Users:" +msgstr "" + +#: templates/settings.php:57 +msgid "UUID Attribute for Groups:" +msgstr "" + +#: templates/settings.php:58 +msgid "Username-LDAP User Mapping" +msgstr "" + +#: templates/settings.php:59 +msgid "" +"Usernames are used to store and assign (meta) data. In order to precisely " +"identify and recognize users, each LDAP user will have a internal username. " +"This requires a mapping from username to LDAP user. The created username is " +"mapped to the UUID of the LDAP user. Additionally the DN is cached as well " +"to reduce LDAP interaction, but it is not used for identification. If the DN" +" changes, the changes will be found. The internal username is used all over." +" Clearing the mappings will have leftovers everywhere. Clearing the mappings" +" is not configuration sensitive, it affects all LDAP configurations! Never " +"clear the mappings in a production environment, only in a testing or " +"experimental stage." +msgstr "" + +#: templates/settings.php:60 +msgid "Clear Username-LDAP User Mapping" +msgstr "" + +#: templates/settings.php:60 +msgid "Clear Groupname-LDAP Group Mapping" +msgstr "" diff --git a/l10n/ur/user_webdavauth.po b/l10n/ur/user_webdavauth.po new file mode 100644 index 0000000000..8db54c86db --- /dev/null +++ b/l10n/ur/user_webdavauth.po @@ -0,0 +1,33 @@ +# 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: translations@owncloud.org\n" +"POT-Creation-Date: 2014-01-07 01:55-0500\n" +"PO-Revision-Date: 2014-01-06 23:45+0000\n" +"Last-Translator: I Robot\n" +"Language-Team: Urdu (http://www.transifex.com/projects/p/owncloud/language/ur/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ur\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: templates/settings.php:3 +msgid "WebDAV Authentication" +msgstr "" + +#: templates/settings.php:4 +msgid "Address: " +msgstr "" + +#: templates/settings.php:7 +msgid "" +"The user credentials will be sent to this address. This plugin checks the " +"response and will interpret the HTTP statuscodes 401 and 403 as invalid " +"credentials, and all other responses as valid credentials." +msgstr "" diff --git a/lib/l10n/ur.php b/lib/l10n/ur.php new file mode 100644 index 0000000000..15f78e0bce --- /dev/null +++ b/lib/l10n/ur.php @@ -0,0 +1,8 @@ + array("",""), +"_%n hour ago_::_%n hours ago_" => array("",""), +"_%n day go_::_%n days ago_" => array("",""), +"_%n month ago_::_%n months ago_" => array("","") +); +$PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; From ed469a7d2c11b92cad4446a596c2b27c2d46362b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Tue, 7 Jan 2014 11:53:33 +0100 Subject: [PATCH 042/293] in order to work properly with encryption ocTransferId is added to the file path - questionable usage of magic string --- lib/private/connector/sabre/file.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/private/connector/sabre/file.php b/lib/private/connector/sabre/file.php index d476e9fab1..53524ec9e5 100644 --- a/lib/private/connector/sabre/file.php +++ b/lib/private/connector/sabre/file.php @@ -64,7 +64,7 @@ class OC_Connector_Sabre_File extends OC_Connector_Sabre_Node implements Sabre_D } // mark file as partial while uploading (ignored by the scanner) - $partpath = $this->path . rand() . '.part'; + $partpath = $this->path . '.ocTransferId' . rand() . '.part'; // if file is located in /Shared we write the part file to the users // root folder because we can't create new files in /shared From 07a84aa5ebc71c1476f89eb5736754b7a2f74d47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Tue, 7 Jan 2014 14:52:18 +0100 Subject: [PATCH 043/293] reuse existing helper function OC_Helper::is_function_enabled --- lib/private/preview/movies.php | 2 +- lib/private/preview/office.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/private/preview/movies.php b/lib/private/preview/movies.php index ac771deb41..71cd3bae05 100644 --- a/lib/private/preview/movies.php +++ b/lib/private/preview/movies.php @@ -18,7 +18,7 @@ function findBinaryPath($program) { // movie preview is currently not supported on Windows if (!\OC_Util::runningOnWindows()) { - $isExecEnabled = !in_array('exec', explode(', ', ini_get('disable_functions'))); + $isExecEnabled = \OC_Helper::is_function_enabled('exec'); $ffmpegBinary = null; $avconvBinary = null; diff --git a/lib/private/preview/office.php b/lib/private/preview/office.php index 318ab51f85..7a4826c76e 100644 --- a/lib/private/preview/office.php +++ b/lib/private/preview/office.php @@ -7,7 +7,7 @@ */ //both, libreoffice backend and php fallback, need imagick if (extension_loaded('imagick')) { - $isShellExecEnabled = !in_array('shell_exec', explode(', ', ini_get('disable_functions'))); + $isShellExecEnabled = \OC_Helper::is_function_enabled('shell_exec'); // LibreOffice preview is currently not supported on Windows if (!\OC_Util::runningOnWindows()) { From 9d869ab5968b737531a0f0bb3c648d7ffe920341 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Tue, 7 Jan 2014 14:53:02 +0100 Subject: [PATCH 044/293] we shall explode on ',' only --- lib/private/helper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/private/helper.php b/lib/private/helper.php index 4fe3097af2..a06932a11f 100644 --- a/lib/private/helper.php +++ b/lib/private/helper.php @@ -858,7 +858,7 @@ class OC_Helper { if (!function_exists($function_name)) { return false; } - $disabled = explode(', ', ini_get('disable_functions')); + $disabled = explode(',', ini_get('disable_functions')); if (in_array($function_name, $disabled)) { return false; } From 9404a8f40c51f57309d3b5a3b5937f869d563573 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Friedrich=20Dreyer?= Date: Tue, 7 Jan 2014 15:51:08 +0100 Subject: [PATCH 045/293] remove duplicate exe mimetype, add correct msi mimetype --- lib/private/mimetypes.list.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/private/mimetypes.list.php b/lib/private/mimetypes.list.php index 740982910e..0822833696 100644 --- a/lib/private/mimetypes.list.php +++ b/lib/private/mimetypes.list.php @@ -66,6 +66,7 @@ return array( 'xlsx'=>'application/msexcel', 'php'=>'application/x-php', 'exe'=>'application/x-ms-dos-executable', + 'msi'=>'application/x-msi', 'pl'=>'application/x-pearl', 'py'=>'application/x-python', 'blend'=>'application/x-blender', @@ -97,8 +98,6 @@ return array( 'ai' => 'application/illustrator', 'epub' => 'application/epub+zip', 'mobi' => 'application/x-mobipocket-ebook', - 'exe' => 'application', - 'msi' => 'application', 'md' => 'text/markdown', 'markdown' => 'text/markdown', 'mdown' => 'text/markdown', From e0bd7e145cb23823c430114f314ffef939877e09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Tue, 7 Jan 2014 16:24:05 +0100 Subject: [PATCH 046/293] Remove @ in order to get proper error handling --- lib/base.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/base.php b/lib/base.php index cf1ffc0177..a8e9e90184 100644 --- a/lib/base.php +++ b/lib/base.php @@ -479,7 +479,7 @@ class OC { // setup 3rdparty autoloader $vendorAutoLoad = OC::$THIRDPARTYROOT . '/3rdparty/autoload.php'; - if (@file_exists($vendorAutoLoad)) { + if (file_exists($vendorAutoLoad)) { require_once $vendorAutoLoad; } From 09d7882571e047de4ed907f0f0317dae056cf890 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Tue, 7 Jan 2014 19:47:01 +0100 Subject: [PATCH 047/293] trimming all array elements --- lib/private/helper.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/private/helper.php b/lib/private/helper.php index a06932a11f..1c8d01c141 100644 --- a/lib/private/helper.php +++ b/lib/private/helper.php @@ -859,10 +859,12 @@ class OC_Helper { return false; } $disabled = explode(',', ini_get('disable_functions')); + $disabled = array_map('trim', $disabled); if (in_array($function_name, $disabled)) { return false; } - $disabled = explode(', ', ini_get('suhosin.executor.func.blacklist')); + $disabled = explode(',', ini_get('suhosin.executor.func.blacklist')); + $disabled = array_map('trim', $disabled); if (in_array($function_name, $disabled)) { return false; } From 5be4af9f519ef8d0424f8b07ba84c43da9cf11f4 Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Tue, 7 Jan 2014 17:41:04 +0100 Subject: [PATCH 048/293] Now also preventing to override "files" dir size with -1 Fixes #6526 --- lib/private/files/cache/homecache.php | 2 +- tests/lib/files/cache/homecache.php | 18 ++++++++++++------ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/lib/private/files/cache/homecache.php b/lib/private/files/cache/homecache.php index 18dfbfe319..71bb944da7 100644 --- a/lib/private/files/cache/homecache.php +++ b/lib/private/files/cache/homecache.php @@ -16,7 +16,7 @@ class HomeCache extends Cache { * @return int */ public function calculateFolderSize($path) { - if ($path !== '/' and $path !== '') { + if ($path !== '/' and $path !== '' and $path !== 'files') { return parent::calculateFolderSize($path); } diff --git a/tests/lib/files/cache/homecache.php b/tests/lib/files/cache/homecache.php index 2fa7f1ba92..87fd0dba4c 100644 --- a/tests/lib/files/cache/homecache.php +++ b/tests/lib/files/cache/homecache.php @@ -62,33 +62,39 @@ class HomeCache extends \PHPUnit_Framework_TestCase { } /** - * Tests that the root folder size calculation ignores the subdirs that have an unknown - * size. This makes sure that quota calculation still works as it's based on the root - * folder size. + * Tests that the root and files folder size calculation ignores the subdirs + * that have an unknown size. This makes sure that quota calculation still + * works as it's based on the "files" folder size. */ public function testRootFolderSizeIgnoresUnknownUpdate() { - $dir1 = 'knownsize'; - $dir2 = 'unknownsize'; + $dir1 = 'files/knownsize'; + $dir2 = 'files/unknownsize'; $fileData = array(); $fileData[''] = array('size' => -1, 'mtime' => 20, 'mimetype' => 'httpd/unix-directory'); + $fileData['files'] = array('size' => -1, 'mtime' => 20, 'mimetype' => 'httpd/unix-directory'); $fileData[$dir1] = array('size' => 1000, 'mtime' => 20, 'mimetype' => 'httpd/unix-directory'); $fileData[$dir2] = array('size' => -1, 'mtime' => 25, 'mimetype' => 'httpd/unix-directory'); $this->cache->put('', $fileData['']); + $this->cache->put('files', $fileData['files']); $this->cache->put($dir1, $fileData[$dir1]); $this->cache->put($dir2, $fileData[$dir2]); + $this->assertTrue($this->cache->inCache('files')); $this->assertTrue($this->cache->inCache($dir1)); $this->assertTrue($this->cache->inCache($dir2)); - // check that root size ignored the unknown sizes + // check that files and root size ignored the unknown sizes + $this->assertEquals(1000, $this->cache->calculateFolderSize('files')); $this->assertEquals(1000, $this->cache->calculateFolderSize('')); // clean up $this->cache->remove(''); + $this->cache->remove('files'); $this->cache->remove($dir1); $this->cache->remove($dir2); + $this->assertFalse($this->cache->inCache('files')); $this->assertFalse($this->cache->inCache($dir1)); $this->assertFalse($this->cache->inCache($dir2)); } From 1e1ced777275c70307d26556843938e68ca25fde Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Tue, 7 Jan 2014 23:05:37 +0100 Subject: [PATCH 049/293] Introduce user count action to user management --- lib/private/user/backend.php | 16 +++++++++------- lib/private/user/database.php | 15 +++++++++++++++ lib/private/user/manager.php | 18 ++++++++++++++++++ 3 files changed, 42 insertions(+), 7 deletions(-) diff --git a/lib/private/user/backend.php b/lib/private/user/backend.php index 02c93d13bd..6969ce4ba3 100644 --- a/lib/private/user/backend.php +++ b/lib/private/user/backend.php @@ -31,13 +31,14 @@ define('OC_USER_BACKEND_NOT_IMPLEMENTED', -501); /** * actions that user backends can define */ -define('OC_USER_BACKEND_CREATE_USER', 0x0000001); -define('OC_USER_BACKEND_SET_PASSWORD', 0x0000010); -define('OC_USER_BACKEND_CHECK_PASSWORD', 0x0000100); -define('OC_USER_BACKEND_GET_HOME', 0x0001000); -define('OC_USER_BACKEND_GET_DISPLAYNAME', 0x0010000); -define('OC_USER_BACKEND_SET_DISPLAYNAME', 0x0100000); -define('OC_USER_BACKEND_PROVIDE_AVATAR', 0x1000000); +define('OC_USER_BACKEND_CREATE_USER', 0x00000001); +define('OC_USER_BACKEND_SET_PASSWORD', 0x00000010); +define('OC_USER_BACKEND_CHECK_PASSWORD', 0x00000100); +define('OC_USER_BACKEND_GET_HOME', 0x00001000); +define('OC_USER_BACKEND_GET_DISPLAYNAME', 0x00010000); +define('OC_USER_BACKEND_SET_DISPLAYNAME', 0x00100000); +define('OC_USER_BACKEND_PROVIDE_AVATAR', 0x01000000); +define('OC_USER_BACKEND_COUNT_USERS', 0x10000000); /** * Abstract base class for user management. Provides methods for querying backend @@ -55,6 +56,7 @@ abstract class OC_User_Backend implements OC_User_Interface { OC_USER_BACKEND_GET_DISPLAYNAME => 'getDisplayName', OC_USER_BACKEND_SET_DISPLAYNAME => 'setDisplayName', OC_USER_BACKEND_PROVIDE_AVATAR => 'canChangeAvatar', + OC_USER_BACKEND_COUNT_USERS => 'countUsers', ); /** diff --git a/lib/private/user/database.php b/lib/private/user/database.php index c99db3b27c..1a63755b98 100644 --- a/lib/private/user/database.php +++ b/lib/private/user/database.php @@ -253,4 +253,19 @@ class OC_User_Database extends OC_User_Backend { return true; } + /** + * counts the users in the database + * + * @return int | bool + */ + public function countUsers() { + $query = OC_DB::prepare('SELECT COUNT(*) FROM `*PREFIX*users`'); + $result = $query->execute(); + if (OC_DB::isError($result)) { + OC_Log::write('core', OC_DB::getErrorMessage($result), OC_Log::ERROR); + return false; + } + return $result->fetchOne(); + } + } diff --git a/lib/private/user/manager.php b/lib/private/user/manager.php index cf83a75ba2..101b388f1e 100644 --- a/lib/private/user/manager.php +++ b/lib/private/user/manager.php @@ -270,4 +270,22 @@ class Manager extends PublicEmitter { } return false; } + + /** + * returns how many users per backend exist (if supported by backend) + * + * @return array with backend class as key and count number as value + */ + public function countUsers() { + $userCountStatistics = array(); + foreach ($this->backends as $backend) { + if ($backend->implementsActions(\OC_USER_BACKEND_COUNT_USERS)) { + $backendusers = $backend->countUsers(); + if($backendusers !== false) { + $userCountStatistics[get_class($backend)] = $backendusers; + } + } + } + return $userCountStatistics; + } } From bc1235d325c5b8ff659afc6700e82e35e2912fbb Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Tue, 7 Jan 2014 23:06:37 +0100 Subject: [PATCH 050/293] Add command line tool to show numbers of users and user directories --- core/command/user/report.php | 61 ++++++++++++++++++++++++++++++++++++ core/register_command.php | 1 + 2 files changed, 62 insertions(+) create mode 100644 core/command/user/report.php diff --git a/core/command/user/report.php b/core/command/user/report.php new file mode 100644 index 0000000000..f95ba251bc --- /dev/null +++ b/core/command/user/report.php @@ -0,0 +1,61 @@ + + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OC\Core\Command\User; + +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Input\InputArgument; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Console\Helper\TableHelper; + +class Report extends Command { + protected function configure() { + $this + ->setName('user:report') + ->setDescription('shows how many users have access'); + } + + protected function execute(InputInterface $input, OutputInterface $output) { + $table = $this->getHelperSet()->get('table'); + $table->setHeaders(array('User Report', '')); + $userCountArray = $this->countUsers(); + if(!empty($userCountArray)) { + $total = 0; + $rows = array(); + foreach($userCountArray as $classname => $users) { + $total += $users; + $rows[] = array($classname, $users); + } + + $rows[] = array(' '); + $rows[] = array('total users', $total); + } else { + $rows[] = array('No backend enabled that supports user counting', ''); + } + + $userDirectoryCount = $this->countUserDirectories(); + $rows[] = array(' '); + $rows[] = array('user directories', $userDirectoryCount); + + $table->setRows($rows); + $table->render($output); + } + + private function countUsers() { + \OC_App::loadApps(array('authentication')); + $userManager = \OC::$server->getUserManager(); + return $userManager->countUsers(); + } + + private function countUserDirectories() { + $dataview = new \OC\Files\View('/'); + $userDirectories = $dataview->getDirectoryContent('/', 'httpd/unix-directory'); + return count($userDirectories); + } +} \ No newline at end of file diff --git a/core/register_command.php b/core/register_command.php index e4f3b12436..2efa838e9e 100644 --- a/core/register_command.php +++ b/core/register_command.php @@ -15,3 +15,4 @@ $application->add(new OC\Core\Command\App\Disable()); $application->add(new OC\Core\Command\App\Enable()); $application->add(new OC\Core\Command\App\ListApps()); $application->add(new OC\Core\Command\Maintenance\Repair(new \OC\Repair())); +$application->add(new OC\Core\Command\User\Report()); From 6be2dee5bca4a38d621f5f5c408b1bd021722f29 Mon Sep 17 00:00:00 2001 From: Jenkins for ownCloud Date: Wed, 8 Jan 2014 01:55:41 -0500 Subject: [PATCH 051/293] [tx-robot] updated from transifex --- 3rdparty | 2 +- apps/files_encryption/l10n/id.php | 37 ++++++++++++- apps/files_sharing/l10n/id.php | 15 ++++-- core/l10n/da.php | 2 +- l10n/da/core.po | 31 +++++------ l10n/id/core.po | 26 ++++----- l10n/id/files.po | 6 +-- l10n/id/files_encryption.po | 83 +++++++++++++++-------------- l10n/id/files_sharing.po | 31 +++++------ l10n/id/files_trashbin.po | 26 ++++----- l10n/id/settings.po | 4 +- l10n/id/user_ldap.po | 6 +-- 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_trashbin.pot | 2 +- l10n/templates/files_versions.pot | 2 +- l10n/templates/lib.pot | 12 ++--- l10n/templates/private.pot | 12 ++--- l10n/templates/settings.pot | 2 +- l10n/templates/user_ldap.pot | 2 +- l10n/templates/user_webdavauth.pot | 2 +- 24 files changed, 180 insertions(+), 133 deletions(-) diff --git a/3rdparty b/3rdparty index 0faf6063ac..42efd96628 160000 --- a/3rdparty +++ b/3rdparty @@ -1 +1 @@ -Subproject commit 0faf6063ac55d3bc82d2a781548ad0f00e77360c +Subproject commit 42efd966284debadf83b761367e529bc45f806d6 diff --git a/apps/files_encryption/l10n/id.php b/apps/files_encryption/l10n/id.php index 32c348bd8b..a719d44582 100644 --- a/apps/files_encryption/l10n/id.php +++ b/apps/files_encryption/l10n/id.php @@ -1,6 +1,41 @@ "Kunci pemulihan berhasil diaktifkan", +"Could not enable recovery key. Please check your recovery key password!" => "Tidak dapat mengaktifkan kunci pemulihan. Silakan periksa sandi kunci pemulihan Anda!", +"Recovery key successfully disabled" => "Kunci pemulihan berhasil dinonaktifkan", +"Could not disable recovery key. Please check your recovery key password!" => "Tidak dapat menonaktifkan kunci pemulihan. Silakan periksa sandi kunci pemulihan Anda!", +"Password successfully changed." => "Sandi berhasil diubah", +"Could not change the password. Maybe the old password was not correct." => "Tidak dapat mengubah sandi. Kemungkinan sandi lama yang dimasukkan salah.", +"Private key password successfully updated." => "Sandi kunci privat berhasil diperbarui.", +"Could not update the private key password. Maybe the old password was not correct." => "Tidak dapat memperbarui sandi kunci privat. Kemungkinan sandi lama yang Anda masukkan salah.", +"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." => "Tidak dapat mendekripsi berkas ini, mungkin ini adalah berkas bersama. Silakan meminta pemilik berkas ini untuk membagikan kembali dengan Anda.", +"Unknown error please check your system settings or contact your administrator" => "Kesalahan tak dikenal, silakan periksa pengaturan sistem Anda atau hubungi admin.", +"Missing requirements." => "Persyaratan yang hilang.", +"Following users are not set up for encryption:" => "Pengguna berikut belum diatur untuk enkripsi:", +"Initial encryption started... This can take some time. Please wait." => "Inisial enskripsi dijalankan... Ini dapat memakan waktu. Silakan tunggu.", "Saving..." => "Menyimpan...", -"Encryption" => "Enkripsi" +"Go directly to your " => "Langsung ke anda", +"personal settings" => "pengaturan pribadi", +"Encryption" => "Enkripsi", +"Enable recovery key (allow to recover users files in case of password loss):" => "Aktifkan kunci pemulihan (memungkinkan pengguna untuk memulihkan berkas dalam kasus kehilangan sandi):", +"Recovery key password" => "Sandi kunci pemulihan", +"Repeat Recovery key password" => "Ulangi sandi kunci Pemulihan", +"Enabled" => "Diaktifkan", +"Disabled" => "Dinonaktifkan", +"Change recovery key password:" => "Ubah sandi kunci pemulihan:", +"Old Recovery key password" => "Sandi kunci Pemulihan Lama", +"New Recovery key password" => "Sandi kunci Pemulihan Baru", +"Repeat New Recovery key password" => "Ulangi sandi kunci Pemulihan baru", +"Change Password" => "Ubah sandi", +"Your private key password no longer match your log-in password:" => "Sandi kunci privat Anda tidak lagi cocok dengan sandi masuk:", +"Set your old private key password to your current log-in password." => "Atur sandi kunci privat lama Anda sebagai sandi masuk Anda saat ini.", +" If you don't remember your old password you can ask your administrator to recover your files." => "Jika Anda tidak ingat sandi lama, Anda dapat meminta administrator Anda untuk memulihkan berkas.", +"Old log-in password" => "Sandi masuk yang lama", +"Current log-in password" => "Sandi masuk saat ini", +"Update Private Key Password" => "Perbarui Sandi Kunci Privat", +"Enable password recovery:" => "Aktifkan sandi pemulihan:", +"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" => "Mengaktifkan opsi ini memungkinkan Anda untuk mendapatkan kembali akses ke berkas terenkripsi Anda dalam kasus kehilangan sandi", +"File recovery settings updated" => "Pengaturan pemulihan berkas diperbarui", +"Could not update file recovery" => "Tidak dapat memperbarui pemulihan berkas" ); $PLURAL_FORMS = "nplurals=1; plural=0;"; diff --git a/apps/files_sharing/l10n/id.php b/apps/files_sharing/l10n/id.php index e91ef94bf3..865a951c2d 100644 --- a/apps/files_sharing/l10n/id.php +++ b/apps/files_sharing/l10n/id.php @@ -1,11 +1,20 @@ "Berbagi ini dilindungi sandi", +"The password is wrong. Try again." => "Sandi salah. Coba lagi", "Password" => "Sandi", +"Sorry, this link doesn’t seem to work anymore." => "Maaf, tautan ini tampaknya tidak berfungsi lagi.", +"Reasons might be:" => "Alasan mungkin:", +"the item was removed" => "item telah dihapus", +"the link expired" => "tautan telah kadaluarsa", +"sharing is disabled" => "berbagi dinonaktifkan", +"For more info, please ask the person who sent this link." => "Untuk info lebih lanjut, silakan tanyakan orang yang mengirim tautan ini.", "%s shared the folder %s with you" => "%s membagikan folder %s dengan Anda", -"%s shared the file %s with you" => "%s membagikan file %s dengan Anda", +"%s shared the file %s with you" => "%s membagikan berkas %s dengan Anda", "Download" => "Unduh", "Upload" => "Unggah", -"Cancel upload" => "Batal pengunggahan", -"No preview available for" => "Tidak ada pratinjau tersedia untuk" +"Cancel upload" => "Batal unggah", +"No preview available for" => "Tidak ada pratinjau yang tersedia untuk", +"Direct link" => "Tautan langsung" ); $PLURAL_FORMS = "nplurals=1; plural=0;"; diff --git a/core/l10n/da.php b/core/l10n/da.php index 8aa6833545..9c7fdc889f 100644 --- a/core/l10n/da.php +++ b/core/l10n/da.php @@ -153,7 +153,7 @@ $TRANSLATIONS = array( "Database tablespace" => "Database tabelplads", "Database host" => "Databasehost", "Finish setup" => "Afslut opsætning", -"Finishing …" => "Færdigbehandling ...", +"Finishing …" => "Færdigbehandler ...", "This application requires JavaScript to be enabled for correct operation. Please enable JavaScript and re-load this interface." => "Programmet forudsætter at JavaScript er aktiveret for at kunne afvikles korrekt. Aktiver JavaScript og genindlæs siden..", "%s is available. Get more information on how to update." => "%s er tilgængelig. Få mere information om, hvordan du opdaterer.", "Log out" => "Log ud", diff --git a/l10n/da/core.po b/l10n/da/core.po index 95c55f74fe..8ef32c0b7b 100644 --- a/l10n/da/core.po +++ b/l10n/da/core.po @@ -7,15 +7,16 @@ # claus_chr , 2013 # kaffeldt , 2013 # lodahl , 2013 +# Morten Juhl-Johansen Zölde-Fejér , 2014 # Ole Holm Frandsen , 2013 # Peter Jespersen , 2013 msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" -"POT-Creation-Date: 2013-12-21 01:55-0500\n" -"PO-Revision-Date: 2013-12-20 21:40+0000\n" -"Last-Translator: lodahl \n" +"POT-Creation-Date: 2014-01-08 01:55-0500\n" +"PO-Revision-Date: 2014-01-07 08:50+0000\n" +"Last-Translator: Morten Juhl-Johansen Zölde-Fejér \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" @@ -158,55 +159,55 @@ msgstr "December" msgid "Settings" msgstr "Indstillinger" -#: js/js.js:869 +#: js/js.js:872 msgid "seconds ago" msgstr "sekunder siden" -#: js/js.js:870 +#: js/js.js:873 msgid "%n minute ago" msgid_plural "%n minutes ago" msgstr[0] "%n minut siden" msgstr[1] "%n minutter siden" -#: js/js.js:871 +#: js/js.js:874 msgid "%n hour ago" msgid_plural "%n hours ago" msgstr[0] "%n time siden" msgstr[1] "%n timer siden" -#: js/js.js:872 +#: js/js.js:875 msgid "today" msgstr "i dag" -#: js/js.js:873 +#: js/js.js:876 msgid "yesterday" msgstr "i går" -#: js/js.js:874 +#: js/js.js:877 msgid "%n day ago" msgid_plural "%n days ago" msgstr[0] "%n dag siden" msgstr[1] "%n dage siden" -#: js/js.js:875 +#: js/js.js:878 msgid "last month" msgstr "sidste måned" -#: js/js.js:876 +#: js/js.js:879 msgid "%n month ago" msgid_plural "%n months ago" msgstr[0] "%n måned siden" msgstr[1] "%n måneder siden" -#: js/js.js:877 +#: js/js.js:880 msgid "months ago" msgstr "måneder siden" -#: js/js.js:878 +#: js/js.js:881 msgid "last year" msgstr "sidste år" -#: js/js.js:879 +#: js/js.js:882 msgid "years ago" msgstr "år siden" @@ -685,7 +686,7 @@ msgstr "Afslut opsætning" #: templates/installation.php:185 msgid "Finishing …" -msgstr "Færdigbehandling ..." +msgstr "Færdigbehandler ..." #: templates/layout.user.php:40 msgid "" diff --git a/l10n/id/core.po b/l10n/id/core.po index d102e4fe61..b386490605 100644 --- a/l10n/id/core.po +++ b/l10n/id/core.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" -"POT-Creation-Date: 2013-12-31 01:55-0500\n" -"PO-Revision-Date: 2013-12-31 03:40+0000\n" +"POT-Creation-Date: 2014-01-08 01:55-0500\n" +"PO-Revision-Date: 2014-01-07 07:10+0000\n" "Last-Translator: arifpedia \n" "Language-Team: Indonesian (http://www.transifex.com/projects/p/owncloud/language/id/)\n" "MIME-Version: 1.0\n" @@ -152,51 +152,51 @@ msgstr "Desember" msgid "Settings" msgstr "Pengaturan" -#: js/js.js:869 +#: js/js.js:872 msgid "seconds ago" msgstr "beberapa detik yang lalu" -#: js/js.js:870 +#: js/js.js:873 msgid "%n minute ago" msgid_plural "%n minutes ago" msgstr[0] "%n menit yang lalu" -#: js/js.js:871 +#: js/js.js:874 msgid "%n hour ago" msgid_plural "%n hours ago" msgstr[0] "%n jam yang lalu" -#: js/js.js:872 +#: js/js.js:875 msgid "today" msgstr "hari ini" -#: js/js.js:873 +#: js/js.js:876 msgid "yesterday" msgstr "kemarin" -#: js/js.js:874 +#: js/js.js:877 msgid "%n day ago" msgid_plural "%n days ago" msgstr[0] "%n hari yang lalu" -#: js/js.js:875 +#: js/js.js:878 msgid "last month" msgstr "bulan kemarin" -#: js/js.js:876 +#: js/js.js:879 msgid "%n month ago" msgid_plural "%n months ago" msgstr[0] "%n bulan yang lalu" -#: js/js.js:877 +#: js/js.js:880 msgid "months ago" msgstr "beberapa bulan lalu" -#: js/js.js:878 +#: js/js.js:881 msgid "last year" msgstr "tahun kemarin" -#: js/js.js:879 +#: js/js.js:882 msgid "years ago" msgstr "beberapa tahun lalu" diff --git a/l10n/id/files.po b/l10n/id/files.po index 74a84b5c52..b215125282 100644 --- a/l10n/id/files.po +++ b/l10n/id/files.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" -"POT-Creation-Date: 2013-12-20 01:55-0500\n" -"PO-Revision-Date: 2013-12-20 06:23+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2014-01-08 01:55-0500\n" +"PO-Revision-Date: 2014-01-07 08:10+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" diff --git a/l10n/id/files_encryption.po b/l10n/id/files_encryption.po index ac25567dcc..7bc9584010 100644 --- a/l10n/id/files_encryption.po +++ b/l10n/id/files_encryption.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# arifpedia , 2014 msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" -"POT-Creation-Date: 2013-11-29 14:08-0500\n" -"PO-Revision-Date: 2013-11-29 19:08+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2014-01-08 01:55-0500\n" +"PO-Revision-Date: 2014-01-07 07:40+0000\n" +"Last-Translator: arifpedia \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" @@ -19,39 +20,39 @@ msgstr "" #: ajax/adminrecovery.php:29 msgid "Recovery key successfully enabled" -msgstr "" +msgstr "Kunci pemulihan berhasil diaktifkan" #: ajax/adminrecovery.php:34 msgid "" "Could not enable recovery key. Please check your recovery key password!" -msgstr "" +msgstr "Tidak dapat mengaktifkan kunci pemulihan. Silakan periksa sandi kunci pemulihan Anda!" #: ajax/adminrecovery.php:48 msgid "Recovery key successfully disabled" -msgstr "" +msgstr "Kunci pemulihan berhasil dinonaktifkan" #: ajax/adminrecovery.php:53 msgid "" "Could not disable recovery key. Please check your recovery key password!" -msgstr "" +msgstr "Tidak dapat menonaktifkan kunci pemulihan. Silakan periksa sandi kunci pemulihan Anda!" #: ajax/changeRecoveryPassword.php:49 msgid "Password successfully changed." -msgstr "" +msgstr "Sandi berhasil diubah" #: ajax/changeRecoveryPassword.php:51 msgid "Could not change the password. Maybe the old password was not correct." -msgstr "" +msgstr "Tidak dapat mengubah sandi. Kemungkinan sandi lama yang dimasukkan salah." #: ajax/updatePrivateKeyPassword.php:52 msgid "Private key password successfully updated." -msgstr "" +msgstr "Sandi kunci privat berhasil diperbarui." #: ajax/updatePrivateKeyPassword.php:54 msgid "" "Could not update the private key password. Maybe the old password was not " "correct." -msgstr "" +msgstr "Tidak dapat memperbarui sandi kunci privat. Kemungkinan sandi lama yang Anda masukkan salah." #: files/error.php:12 msgid "" @@ -72,32 +73,32 @@ msgstr "" msgid "" "Can not decrypt this file, probably this is a shared file. Please ask the " "file owner to reshare the file with you." -msgstr "" +msgstr "Tidak dapat mendekripsi berkas ini, mungkin ini adalah berkas bersama. Silakan meminta pemilik berkas ini untuk membagikan kembali dengan Anda." #: files/error.php:22 files/error.php:27 msgid "" "Unknown error please check your system settings or contact your " "administrator" -msgstr "" +msgstr "Kesalahan tak dikenal, silakan periksa pengaturan sistem Anda atau hubungi admin." -#: hooks/hooks.php:59 +#: hooks/hooks.php:62 msgid "Missing requirements." -msgstr "" +msgstr "Persyaratan yang hilang." -#: hooks/hooks.php:60 +#: hooks/hooks.php:63 msgid "" "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL " "together with the PHP extension is enabled and configured properly. For now," " the encryption app has been disabled." msgstr "" -#: hooks/hooks.php:273 +#: hooks/hooks.php:281 msgid "Following users are not set up for encryption:" -msgstr "" +msgstr "Pengguna berikut belum diatur untuk enkripsi:" #: js/detect-migration.js:21 msgid "Initial encryption started... This can take some time. Please wait." -msgstr "" +msgstr "Inisial enskripsi dijalankan... Ini dapat memakan waktu. Silakan tunggu." #: js/settings-admin.js:13 msgid "Saving..." @@ -105,11 +106,11 @@ msgstr "Menyimpan..." #: templates/invalid_private_key.php:8 msgid "Go directly to your " -msgstr "" +msgstr "Langsung ke anda" #: templates/invalid_private_key.php:8 msgid "personal settings" -msgstr "" +msgstr "pengaturan pribadi" #: templates/settings-admin.php:4 templates/settings-personal.php:3 msgid "Encryption" @@ -118,84 +119,84 @@ msgstr "Enkripsi" #: templates/settings-admin.php:7 msgid "" "Enable recovery key (allow to recover users files in case of password loss):" -msgstr "" +msgstr "Aktifkan kunci pemulihan (memungkinkan pengguna untuk memulihkan berkas dalam kasus kehilangan sandi):" #: templates/settings-admin.php:11 msgid "Recovery key password" -msgstr "" +msgstr "Sandi kunci pemulihan" #: templates/settings-admin.php:14 msgid "Repeat Recovery key password" -msgstr "" +msgstr "Ulangi sandi kunci Pemulihan" #: templates/settings-admin.php:21 templates/settings-personal.php:51 msgid "Enabled" -msgstr "" +msgstr "Diaktifkan" #: templates/settings-admin.php:29 templates/settings-personal.php:59 msgid "Disabled" -msgstr "" +msgstr "Dinonaktifkan" #: templates/settings-admin.php:34 msgid "Change recovery key password:" -msgstr "" +msgstr "Ubah sandi kunci pemulihan:" #: templates/settings-admin.php:40 msgid "Old Recovery key password" -msgstr "" +msgstr "Sandi kunci Pemulihan Lama" #: templates/settings-admin.php:47 msgid "New Recovery key password" -msgstr "" +msgstr "Sandi kunci Pemulihan Baru" #: templates/settings-admin.php:53 msgid "Repeat New Recovery key password" -msgstr "" +msgstr "Ulangi sandi kunci Pemulihan baru" #: templates/settings-admin.php:58 msgid "Change Password" -msgstr "" +msgstr "Ubah sandi" #: templates/settings-personal.php:9 msgid "Your private key password no longer match your log-in password:" -msgstr "" +msgstr "Sandi kunci privat Anda tidak lagi cocok dengan sandi masuk:" #: templates/settings-personal.php:12 msgid "Set your old private key password to your current log-in password." -msgstr "" +msgstr "Atur sandi kunci privat lama Anda sebagai sandi masuk Anda saat ini." #: templates/settings-personal.php:14 msgid "" " If you don't remember your old password you can ask your administrator to " "recover your files." -msgstr "" +msgstr "Jika Anda tidak ingat sandi lama, Anda dapat meminta administrator Anda untuk memulihkan berkas." #: templates/settings-personal.php:22 msgid "Old log-in password" -msgstr "" +msgstr "Sandi masuk yang lama" #: templates/settings-personal.php:28 msgid "Current log-in password" -msgstr "" +msgstr "Sandi masuk saat ini" #: templates/settings-personal.php:33 msgid "Update Private Key Password" -msgstr "" +msgstr "Perbarui Sandi Kunci Privat" #: templates/settings-personal.php:42 msgid "Enable password recovery:" -msgstr "" +msgstr "Aktifkan sandi pemulihan:" #: templates/settings-personal.php:44 msgid "" "Enabling this option will allow you to reobtain access to your encrypted " "files in case of password loss" -msgstr "" +msgstr "Mengaktifkan opsi ini memungkinkan Anda untuk mendapatkan kembali akses ke berkas terenkripsi Anda dalam kasus kehilangan sandi" #: templates/settings-personal.php:60 msgid "File recovery settings updated" -msgstr "" +msgstr "Pengaturan pemulihan berkas diperbarui" #: templates/settings-personal.php:61 msgid "Could not update file recovery" -msgstr "" +msgstr "Tidak dapat memperbarui pemulihan berkas" diff --git a/l10n/id/files_sharing.po b/l10n/id/files_sharing.po index bdcc98c9d3..c5659df948 100644 --- a/l10n/id/files_sharing.po +++ b/l10n/id/files_sharing.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# arifpedia , 2014 msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" -"POT-Creation-Date: 2013-11-15 22:54-0500\n" -"PO-Revision-Date: 2013-11-13 16:11+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2014-01-08 01:55-0500\n" +"PO-Revision-Date: 2014-01-07 08:00+0000\n" +"Last-Translator: arifpedia \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" @@ -19,11 +20,11 @@ msgstr "" #: templates/authenticate.php:4 msgid "This share is password-protected" -msgstr "" +msgstr "Berbagi ini dilindungi sandi" #: templates/authenticate.php:7 msgid "The password is wrong. Try again." -msgstr "" +msgstr "Sandi salah. Coba lagi" #: templates/authenticate.php:10 msgid "Password" @@ -31,27 +32,27 @@ msgstr "Sandi" #: templates/part.404.php:3 msgid "Sorry, this link doesn’t seem to work anymore." -msgstr "" +msgstr "Maaf, tautan ini tampaknya tidak berfungsi lagi." #: templates/part.404.php:4 msgid "Reasons might be:" -msgstr "" +msgstr "Alasan mungkin:" #: templates/part.404.php:6 msgid "the item was removed" -msgstr "" +msgstr "item telah dihapus" #: templates/part.404.php:7 msgid "the link expired" -msgstr "" +msgstr "tautan telah kadaluarsa" #: templates/part.404.php:8 msgid "sharing is disabled" -msgstr "" +msgstr "berbagi dinonaktifkan" #: templates/part.404.php:10 msgid "For more info, please ask the person who sent this link." -msgstr "" +msgstr "Untuk info lebih lanjut, silakan tanyakan orang yang mengirim tautan ini." #: templates/public.php:18 #, php-format @@ -61,7 +62,7 @@ msgstr "%s membagikan folder %s dengan Anda" #: templates/public.php:21 #, php-format msgid "%s shared the file %s with you" -msgstr "%s membagikan file %s dengan Anda" +msgstr "%s membagikan berkas %s dengan Anda" #: templates/public.php:29 templates/public.php:95 msgid "Download" @@ -73,12 +74,12 @@ msgstr "Unggah" #: templates/public.php:59 msgid "Cancel upload" -msgstr "Batal pengunggahan" +msgstr "Batal unggah" #: templates/public.php:92 msgid "No preview available for" -msgstr "Tidak ada pratinjau tersedia untuk" +msgstr "Tidak ada pratinjau yang tersedia untuk" #: templates/public.php:99 msgid "Direct link" -msgstr "" +msgstr "Tautan langsung" diff --git a/l10n/id/files_trashbin.po b/l10n/id/files_trashbin.po index c6a065cb2f..5f3ad858bd 100644 --- a/l10n/id/files_trashbin.po +++ b/l10n/id/files_trashbin.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" -"POT-Creation-Date: 2013-11-21 10:01-0500\n" -"PO-Revision-Date: 2013-11-16 07:44+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2014-01-08 01:55-0500\n" +"PO-Revision-Date: 2014-01-07 07:10+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" @@ -17,44 +17,44 @@ msgstr "" "Language: id\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: ajax/delete.php:42 +#: ajax/delete.php:63 #, php-format msgid "Couldn't delete %s permanently" msgstr "Tidak dapat menghapus permanen %s" -#: ajax/undelete.php:42 +#: ajax/undelete.php:43 #, php-format msgid "Couldn't restore %s" msgstr "Tidak dapat memulihkan %s" -#: js/trash.js:18 js/trash.js:44 js/trash.js:121 js/trash.js:149 +#: js/trash.js:18 js/trash.js:45 js/trash.js:88 js/trash.js:142 msgid "Error" msgstr "Galat" -#: lib/trashbin.php:815 lib/trashbin.php:817 +#: lib/trashbin.php:905 lib/trashbin.php:907 msgid "restored" msgstr "" -#: templates/index.php:8 +#: templates/index.php:7 msgid "Nothing in here. Your trash bin is empty!" msgstr "Tempat sampah anda kosong!" -#: templates/index.php:22 +#: templates/index.php:20 msgid "Name" msgstr "Nama" -#: templates/index.php:25 templates/index.php:27 +#: templates/index.php:23 templates/index.php:25 msgid "Restore" msgstr "Pulihkan" -#: templates/index.php:33 +#: templates/index.php:31 msgid "Deleted" msgstr "Dihapus" -#: templates/index.php:36 templates/index.php:37 +#: templates/index.php:34 templates/index.php:35 msgid "Delete" msgstr "Hapus" -#: templates/part.breadcrumb.php:9 +#: templates/part.breadcrumb.php:8 msgid "Deleted Files" msgstr "Berkas yang Dihapus" diff --git a/l10n/id/settings.po b/l10n/id/settings.po index e3cda0a7e3..0b8a55abc7 100644 --- a/l10n/id/settings.po +++ b/l10n/id/settings.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" -"POT-Creation-Date: 2013-12-31 01:55-0500\n" -"PO-Revision-Date: 2013-12-31 03:40+0000\n" +"POT-Creation-Date: 2014-01-08 01:55-0500\n" +"PO-Revision-Date: 2014-01-07 08:10+0000\n" "Last-Translator: arifpedia \n" "Language-Team: Indonesian (http://www.transifex.com/projects/p/owncloud/language/id/)\n" "MIME-Version: 1.0\n" diff --git a/l10n/id/user_ldap.po b/l10n/id/user_ldap.po index 368aef3c67..e90f580e2a 100644 --- a/l10n/id/user_ldap.po +++ b/l10n/id/user_ldap.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" -"POT-Creation-Date: 2013-12-31 01:55-0500\n" -"PO-Revision-Date: 2013-12-30 17:20+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2014-01-08 01:55-0500\n" +"PO-Revision-Date: 2014-01-07 07:10+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" diff --git a/l10n/templates/core.pot b/l10n/templates/core.pot index 68737b3593..3bd1bd9070 100644 --- a/l10n/templates/core.pot +++ b/l10n/templates/core.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud Core 6.0.0\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" -"POT-Creation-Date: 2014-01-07 01:55-0500\n" +"POT-Creation-Date: 2014-01-08 01:55-0500\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 913a148343..5396110aed 100644 --- a/l10n/templates/files.pot +++ b/l10n/templates/files.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud Core 6.0.0\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" -"POT-Creation-Date: 2014-01-07 01:55-0500\n" +"POT-Creation-Date: 2014-01-08 01:55-0500\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 5a6e1c929e..31232e16fb 100644 --- a/l10n/templates/files_encryption.pot +++ b/l10n/templates/files_encryption.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud Core 6.0.0\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" -"POT-Creation-Date: 2014-01-07 01:55-0500\n" +"POT-Creation-Date: 2014-01-08 01:55-0500\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 1806d30ff0..b8ac9956fa 100644 --- a/l10n/templates/files_external.pot +++ b/l10n/templates/files_external.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud Core 6.0.0\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" -"POT-Creation-Date: 2014-01-07 01:55-0500\n" +"POT-Creation-Date: 2014-01-08 01:55-0500\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 ffba8dccd3..d0daf4154b 100644 --- a/l10n/templates/files_sharing.pot +++ b/l10n/templates/files_sharing.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud Core 6.0.0\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" -"POT-Creation-Date: 2014-01-07 01:55-0500\n" +"POT-Creation-Date: 2014-01-08 01:55-0500\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_trashbin.pot b/l10n/templates/files_trashbin.pot index 8605f877f4..eadcdd9d3e 100644 --- a/l10n/templates/files_trashbin.pot +++ b/l10n/templates/files_trashbin.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud Core 6.0.0\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" -"POT-Creation-Date: 2014-01-07 01:55-0500\n" +"POT-Creation-Date: 2014-01-08 01:55-0500\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 636e03756a..8ba48805ba 100644 --- a/l10n/templates/files_versions.pot +++ b/l10n/templates/files_versions.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud Core 6.0.0\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" -"POT-Creation-Date: 2014-01-07 01:55-0500\n" +"POT-Creation-Date: 2014-01-08 01:55-0500\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 85ae628dcd..29ab50202b 100644 --- a/l10n/templates/lib.pot +++ b/l10n/templates/lib.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud Core 6.0.0\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" -"POT-Creation-Date: 2014-01-07 01:55-0500\n" +"POT-Creation-Date: 2014-01-08 01:55-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -71,23 +71,23 @@ msgstr "" msgid "cannot open \"%s\"" msgstr "" -#: private/files.php:231 +#: private/files.php:226 msgid "ZIP download is turned off." msgstr "" -#: private/files.php:232 +#: private/files.php:227 msgid "Files need to be downloaded one by one." msgstr "" -#: private/files.php:233 private/files.php:261 +#: private/files.php:228 private/files.php:256 msgid "Back to Files" msgstr "" -#: private/files.php:258 +#: private/files.php:253 msgid "Selected files too large to generate zip file." msgstr "" -#: private/files.php:259 +#: private/files.php:254 msgid "" "Please download the files separately in smaller chunks or kindly ask your " "administrator." diff --git a/l10n/templates/private.pot b/l10n/templates/private.pot index 11e0caf703..fd5e0fded5 100644 --- a/l10n/templates/private.pot +++ b/l10n/templates/private.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud Core 6.0.0\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" -"POT-Creation-Date: 2014-01-07 01:55-0500\n" +"POT-Creation-Date: 2014-01-08 01:55-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -71,23 +71,23 @@ msgstr "" msgid "cannot open \"%s\"" msgstr "" -#: files.php:231 +#: files.php:226 msgid "ZIP download is turned off." msgstr "" -#: files.php:232 +#: files.php:227 msgid "Files need to be downloaded one by one." msgstr "" -#: files.php:233 files.php:261 +#: files.php:228 files.php:256 msgid "Back to Files" msgstr "" -#: files.php:258 +#: files.php:253 msgid "Selected files too large to generate zip file." msgstr "" -#: files.php:259 +#: files.php:254 msgid "" "Please download the files separately in smaller chunks or kindly ask your " "administrator." diff --git a/l10n/templates/settings.pot b/l10n/templates/settings.pot index 5f01a453d6..a25543919a 100644 --- a/l10n/templates/settings.pot +++ b/l10n/templates/settings.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud Core 6.0.0\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" -"POT-Creation-Date: 2014-01-07 01:55-0500\n" +"POT-Creation-Date: 2014-01-08 01:55-0500\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 2b44144273..5e79d17a11 100644 --- a/l10n/templates/user_ldap.pot +++ b/l10n/templates/user_ldap.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud Core 6.0.0\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" -"POT-Creation-Date: 2014-01-07 01:55-0500\n" +"POT-Creation-Date: 2014-01-08 01:55-0500\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 e2933b4ea6..acf94225f5 100644 --- a/l10n/templates/user_webdavauth.pot +++ b/l10n/templates/user_webdavauth.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud Core 6.0.0\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" -"POT-Creation-Date: 2014-01-07 01:55-0500\n" +"POT-Creation-Date: 2014-01-08 01:55-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" From 5eef107344bbb3fc4a93675f6d3b63fc82ba930a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Wed, 8 Jan 2014 07:56:08 +0100 Subject: [PATCH 052/293] turn off mod_pagespeed --- .htaccess | 3 +++ lib/private/setup.php | 3 +++ 2 files changed, 6 insertions(+) diff --git a/.htaccess b/.htaccess index 08e2a82fac..fa6263c7ff 100755 --- a/.htaccess +++ b/.htaccess @@ -38,3 +38,6 @@ DirectoryIndex index.php index.html AddDefaultCharset utf-8 Options -Indexes + + ModPagespeed Off + diff --git a/lib/private/setup.php b/lib/private/setup.php index b5c530a091..5232398d1d 100644 --- a/lib/private/setup.php +++ b/lib/private/setup.php @@ -159,6 +159,9 @@ class OC_Setup { $content.= "\n"; $content.= "AddDefaultCharset utf-8\n"; $content.= "Options -Indexes\n"; + $content.= "\n"; + $content.= "ModPagespeed Off\n"; + $content.= "\n"; @file_put_contents(OC::$SERVERROOT.'/.htaccess', $content); //supress errors in case we don't have permissions for it self::protectDataDirectory(); From b1dfc514e2b959fdda680900206b4533d069b2b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Wed, 8 Jan 2014 09:42:37 +0100 Subject: [PATCH 053/293] Fix submodule 3rdparty - translation sync broke that --- 3rdparty | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty b/3rdparty index 42efd96628..95ab25149c 160000 --- a/3rdparty +++ b/3rdparty @@ -1 +1 @@ -Subproject commit 42efd966284debadf83b761367e529bc45f806d6 +Subproject commit 95ab25149c4903650a1113c01ccb1732fb089f14 From b669e1a3c13dc6fabc8929a4abc4fd13fb8a4450 Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Wed, 8 Jan 2014 12:07:57 +0100 Subject: [PATCH 054/293] LDAP: implement userCount action. This required to (finally) clean up and refactor the search method, which will have a positive performance impact on paged search. --- apps/user_ldap/lib/access.php | 145 +++++++++++++++++++++++++++------- apps/user_ldap/user_ldap.php | 16 +++- apps/user_ldap/user_proxy.php | 15 ++++ 3 files changed, 148 insertions(+), 28 deletions(-) diff --git a/apps/user_ldap/lib/access.php b/apps/user_ldap/lib/access.php index ecc74b6cf5..72f9c74092 100644 --- a/apps/user_ldap/lib/access.php +++ b/apps/user_ldap/lib/access.php @@ -634,6 +634,10 @@ class Access extends LDAPUtility { return $this->search($filter, $this->connection->ldapBaseUsers, $attr, $limit, $offset); } + public function countUsers($filter, $attr = array('dn'), $limit = null, $offset = null) { + return $this->count($filter, $this->connection->ldapBaseGroups, $attr, $limit, $offset); + } + /** * @brief executes an LDAP search, optimized for Groups * @param $filter the LDAP filter for the search @@ -647,61 +651,68 @@ class Access extends LDAPUtility { } /** - * @brief executes an LDAP search + * @brief prepares and executes an LDAP search operation * @param $filter the LDAP filter for the search * @param $base an array containing the LDAP subtree(s) that shall be searched * @param $attr optional, array, one or more attributes that shall be * retrieved. Results will according to the order in the array. - * @returns array with the search result - * - * Executes an LDAP search + * @param $limit optional, maximum results to be counted + * @param $offset optional, a starting point + * @returns array with the search result as first value and pagedSearchOK as + * second | false if not successful */ - private function search($filter, $base, $attr = null, $limit = null, $offset = null, $skipHandling = false) { + private function executeSearch($filter, $base, &$attr = null, $limit = null, $offset = null) { if(!is_null($attr) && !is_array($attr)) { $attr = array(mb_strtolower($attr, 'UTF-8')); } // See if we have a resource, in case not cancel with message - $link_resource = $this->connection->getConnectionResource(); - if(!$this->ldap->isResource($link_resource)) { + $cr = $this->connection->getConnectionResource(); + if(!$this->ldap->isResource($cr)) { // Seems like we didn't find any resource. // Return an empty array just like before. \OCP\Util::writeLog('user_ldap', 'Could not search, because resource is missing.', \OCP\Util::DEBUG); - return array(); + return false; } //check wether paged search should be attempted $pagedSearchOK = $this->initPagedSearch($filter, $base, $attr, $limit, $offset); - $linkResources = array_pad(array(), count($base), $link_resource); + $linkResources = array_pad(array(), count($base), $cr); $sr = $this->ldap->search($linkResources, $base, $filter, $attr); - $error = $this->ldap->errno($link_resource); + $error = $this->ldap->errno($cr); if(!is_array($sr) || $error !== 0) { \OCP\Util::writeLog('user_ldap', - 'Error when searching: '.$this->ldap->error($link_resource). - ' code '.$this->ldap->errno($link_resource), + 'Error when searching: '.$this->ldap->error($cr). + ' code '.$this->ldap->errno($cr), \OCP\Util::ERROR); \OCP\Util::writeLog('user_ldap', 'Attempt for Paging? '.print_r($pagedSearchOK, true), \OCP\Util::ERROR); - return array(); + return false; } - // Do the server-side sorting - foreach(array_reverse($attr) as $sortAttr){ - foreach($sr as $searchResource) { - $this->ldap->sort($link_resource, $searchResource, $sortAttr); - } - } + return array($sr, $pagedSearchOK); + } - $findings = array(); - foreach($sr as $key => $res) { - $findings = array_merge($findings, $this->ldap->getEntries($link_resource, $res )); - } + /** + * @brief processes an LDAP paged search operation + * @param $sr the array containing the LDAP search resources + * @param $filter the LDAP filter for the search + * @param $base an array containing the LDAP subtree(s) that shall be searched + * @param $iFoundItems number of results in the search operation + * @param $limit maximum results to be counted + * @param $offset a starting point + * @param $pagedSearchOK whether a paged search has been executed + * @param $skipHandling required for paged search when cookies to + * prior results need to be gained + * @returns array with the search result as first value and pagedSearchOK as + * second | false if not successful + */ + private function processPagedSearchStatus($sr, $filter, $base, $iFoundItems, $limit, $offset, $pagedSearchOK, $skipHandling) { if($pagedSearchOK) { - \OCP\Util::writeLog('user_ldap', 'Paged search successful', \OCP\Util::INFO); + $cr = $this->connection->getConnectionResource(); foreach($sr as $key => $res) { $cookie = null; - if($this->ldap->controlPagedResultResponse($link_resource, $res, $cookie)) { - \OCP\Util::writeLog('user_ldap', 'Set paged search cookie', \OCP\Util::INFO); + if($this->ldap->controlPagedResultResponse($cr, $res, $cookie)) { $this->setPagedResultCookie($base[$key], $filter, $limit, $offset, $cookie); } } @@ -713,7 +724,7 @@ class Access extends LDAPUtility { // 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. - if($findings['count'] <= $limit) { + if($iFoundItems <= $limit) { $this->pagedSearchedSuccessful = true; } } else { @@ -721,6 +732,86 @@ class Access extends LDAPUtility { \OCP\Util::writeLog('user_ldap', 'Paged search failed :(', \OCP\Util::INFO); } } + } + + /** + * @brief executes an LDAP search, but counts the results only + * @param $filter the LDAP filter for the search + * @param $base an array containing the LDAP subtree(s) that shall be searched + * @param $attr optional, array, one or more attributes that shall be + * retrieved. Results will according to the order in the array. + * @param $limit optional, maximum results to be counted + * @param $offset optional, a starting point + * @param $skipHandling indicates whether the pages search operation is + * completed + * @returns int | false if the search could not be initialized + * + */ + private function count($filter, $base, $attr = null, $limit = null, $offset = null, $skipHandling = false) { + \OCP\Util::writeLog('user_ldap', 'Count filter: '.print_r($filter, true), \OCP\Util::DEBUG); + $search = $this->executeSearch($filter, $base, $attr, $limit, $offset); + if($search === false) { + return false; + } + list($sr, $pagedSearchOK) = $search; + $cr = $this->connection->getConnectionResource(); + $counter = 0; + foreach($sr as $key => $res) { + $count = $this->ldap->countEntries($cr, $res); + if($count !== false) { + $counter += $count; + } + } + + $this->processPagedSearchStatus($sr, $filter, $base, $counter, $limit, + $offset, $pagedSearchOK, $skipHandling); + + return $counter; + } + + /** + * @brief executes an LDAP search + * @param $filter the LDAP filter for the search + * @param $base an array containing the LDAP subtree(s) that shall be searched + * @param $attr optional, array, one or more attributes that shall be + * retrieved. Results will according to the order in the array. + * @returns array with the search result + * + * Executes an LDAP search + */ + private function search($filter, $base, $attr = null, $limit = null, $offset = null, $skipHandling = false) { + $search = $this->executeSearch($filter, $base, $attr, $limit, $offset); + if($search === false) { + return array(); + } + list($sr, $pagedSearchOK) = $search; + $cr = $this->connection->getConnectionResource(); + + if($skipHandling) { + //i.e. result do not need to be fetched, we just need the cookie + //thus pass 1 or any other value as $iFoundItems because it is not + //used + $this->processPagedSearchStatus($sr, $filter, $base, 1, $limit, + $offset, $pagedSearchOK, + $skipHandling); + return; + } + + // Do the server-side sorting + foreach(array_reverse($attr) as $sortAttr){ + foreach($sr as $searchResource) { + $this->ldap->sort($cr, $searchResource, $sortAttr); + } + } + + $findings = array(); + foreach($sr as $key => $res) { + $findings = array_merge($findings, $this->ldap->getEntries($cr , $res )); + } + + $this->processPagedSearchStatus($sr, $filter, $base, $findings['count'], + $limit, $offset, $pagedSearchOK, + $skipHandling); // if we're here, probably no connection resource is returned. // to make ownCloud behave nicely, we simply give back an empty array. diff --git a/apps/user_ldap/user_ldap.php b/apps/user_ldap/user_ldap.php index 527a5c10b8..542d6b00c5 100644 --- a/apps/user_ldap/user_ldap.php +++ b/apps/user_ldap/user_ldap.php @@ -363,7 +363,8 @@ class USER_LDAP extends BackendUtility implements \OCP\UserInterface { return (bool)((OC_USER_BACKEND_CHECK_PASSWORD | OC_USER_BACKEND_GET_HOME | OC_USER_BACKEND_GET_DISPLAYNAME - | OC_USER_BACKEND_PROVIDE_AVATAR) + | OC_USER_BACKEND_PROVIDE_AVATAR + | OC_USER_BACKEND_COUNT_USERS) & $actions); } @@ -373,4 +374,17 @@ class USER_LDAP extends BackendUtility implements \OCP\UserInterface { public function hasUserListings() { return true; } + + /** + * counts the users in LDAP + * + * @return int | bool + */ + public function countUsers() { + $o = $this->access->connection->ldapLoginFilter; + $filter = \OCP\Util::mb_str_replace( + '%uid', '*', $this->access->connection->ldapLoginFilter, 'UTF-8'); + $entries = $this->access->countUsers($filter); + return $entries; + } } diff --git a/apps/user_ldap/user_proxy.php b/apps/user_ldap/user_proxy.php index b073b143e7..5ad127197f 100644 --- a/apps/user_ldap/user_proxy.php +++ b/apps/user_ldap/user_proxy.php @@ -210,4 +210,19 @@ class User_Proxy extends lib\Proxy implements \OCP\UserInterface { return $this->refBackend->hasUserListings(); } + /** + * @brief Count the number of users + * @returns int | bool + */ + public function countUsers() { + $users = false; + foreach($this->backends as $backend) { + $backendUsers = $backend->countUsers(); + if ($backendUsers !== false) { + $users += $backendUsers; + } + } + return $users; + } + } From 53498bc8761d564ee44f1d59e8b85873b5d654da Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Wed, 8 Jan 2014 12:20:56 +0100 Subject: [PATCH 055/293] remove unnecessary line --- apps/user_ldap/user_ldap.php | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/user_ldap/user_ldap.php b/apps/user_ldap/user_ldap.php index 542d6b00c5..a19af86086 100644 --- a/apps/user_ldap/user_ldap.php +++ b/apps/user_ldap/user_ldap.php @@ -381,7 +381,6 @@ class USER_LDAP extends BackendUtility implements \OCP\UserInterface { * @return int | bool */ public function countUsers() { - $o = $this->access->connection->ldapLoginFilter; $filter = \OCP\Util::mb_str_replace( '%uid', '*', $this->access->connection->ldapLoginFilter, 'UTF-8'); $entries = $this->access->countUsers($filter); From 677d83d45fed6e799b9d90927f365d47ba08f93b Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Wed, 8 Jan 2014 12:24:29 +0100 Subject: [PATCH 056/293] LDAP: add tests for countUsers --- apps/user_ldap/tests/user_ldap.php | 54 ++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/apps/user_ldap/tests/user_ldap.php b/apps/user_ldap/tests/user_ldap.php index 6b9b8b3e18..9193a005ae 100644 --- a/apps/user_ldap/tests/user_ldap.php +++ b/apps/user_ldap/tests/user_ldap.php @@ -408,4 +408,58 @@ class Test_User_Ldap_Direct extends \PHPUnit_Framework_TestCase { //no test for getDisplayNames, because it just invokes getUsers and //getDisplayName + + public function testCountUsers() { + $access = $this->getAccessMock(); + + $access->connection->expects($this->once()) + ->method('__get') + ->will($this->returnCallback(function($name) { + if($name === 'ldapLoginFilter') { + return 'uid=%uid'; + } + return null; + })); + + $access->expects($this->once()) + ->method('countUsers') + ->will($this->returnCallback(function($filter, $a, $b, $c) { + if($filter !== 'uid=*') { + return false; + } + return 5; + })); + + $backend = new UserLDAP($access); + + $result = $backend->countUsers(); + $this->assertEquals(5, $result); + } + + public function testCountUsersFailing() { + $access = $this->getAccessMock(); + + $access->connection->expects($this->once()) + ->method('__get') + ->will($this->returnCallback(function($name) { + if($name === 'ldapLoginFilter') { + return 'invalidFilter'; + } + return null; + })); + + $access->expects($this->once()) + ->method('countUsers') + ->will($this->returnCallback(function($filter, $a, $b, $c) { + if($filter !== 'uid=*') { + return false; + } + return 5; + })); + + $backend = new UserLDAP($access); + + $result = $backend->countUsers(); + $this->assertFalse($result); + } } \ No newline at end of file From f642ad39614970de67358d80517bc1d76a006e0e Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Wed, 8 Jan 2014 13:17:36 +0100 Subject: [PATCH 057/293] Prevent deleting storage root Storage mount points are not deletable, so make sure that the unlink operation and its hooks aren't run in such cases. Note that some storages might recursively delete their contents when calling unlink on their root. This fix prevents that as well. --- lib/private/files/view.php | 13 ++++++++++++ tests/lib/files/view.php | 42 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/lib/private/files/view.php b/lib/private/files/view.php index ac45a88133..8893911ed5 100644 --- a/lib/private/files/view.php +++ b/lib/private/files/view.php @@ -336,6 +336,19 @@ class View { } public function unlink($path) { + if ($path === '' || $path === '/') { + // do not allow deleting the root + return false; + } + $postFix = (substr($path, -1, 1) === '/') ? '/' : ''; + $absolutePath = Filesystem::normalizePath($this->getAbsolutePath($path)); + list($storage, $internalPath) = Filesystem::resolvePath($absolutePath . $postFix); + if (!$internalPath || $internalPath === '' || $internalPath === '/') { + // do not allow deleting the storage's root / the mount point + // because for some storages it might delete the whole contents + // but isn't supposed to work that way + return false; + } return $this->basicOperation('unlink', $path, array('delete')); } diff --git a/tests/lib/files/view.php b/tests/lib/files/view.php index b59cef9f0d..76a7fd5f1c 100644 --- a/tests/lib/files/view.php +++ b/tests/lib/files/view.php @@ -306,6 +306,48 @@ class View extends \PHPUnit_Framework_TestCase { $this->assertTrue($rootView->file_exists('anotherfolder/bar.txt')); } + /** + * @medium + */ + function testUnlink() { + $storage1 = $this->getTestStorage(); + $storage2 = $this->getTestStorage(); + \OC\Files\Filesystem::mount($storage1, array(), '/'); + \OC\Files\Filesystem::mount($storage2, array(), '/substorage'); + + $rootView = new \OC\Files\View(''); + $rootView->file_put_contents('/foo.txt', 'asd'); + $rootView->file_put_contents('/substorage/bar.txt', 'asd'); + + $this->assertTrue($rootView->file_exists('foo.txt')); + $this->assertTrue($rootView->file_exists('substorage/bar.txt')); + + $this->assertTrue($rootView->unlink('foo.txt')); + $this->assertTrue($rootView->unlink('substorage/bar.txt')); + + $this->assertFalse($rootView->file_exists('foo.txt')); + $this->assertFalse($rootView->file_exists('substorage/bar.txt')); + } + + /** + * @medium + */ + function testUnlinkRootMustFail() { + $storage1 = $this->getTestStorage(); + $storage2 = $this->getTestStorage(); + \OC\Files\Filesystem::mount($storage1, array(), '/'); + \OC\Files\Filesystem::mount($storage2, array(), '/substorage'); + + $rootView = new \OC\Files\View(''); + $rootView->file_put_contents('/foo.txt', 'asd'); + $rootView->file_put_contents('/substorage/bar.txt', 'asd'); + + $this->assertFalse($rootView->unlink('')); + $this->assertFalse($rootView->unlink('/')); + $this->assertFalse($rootView->unlink('substorage')); + $this->assertFalse($rootView->unlink('/substorage')); + } + /** * @medium */ From cb6a3e2617c6549d4a305f3612bef8aa5840306e Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Wed, 8 Jan 2014 13:24:28 +0100 Subject: [PATCH 058/293] if backends have the same class name, sum their users up instead of overwriting --- lib/private/user/manager.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/private/user/manager.php b/lib/private/user/manager.php index 101b388f1e..90970ef996 100644 --- a/lib/private/user/manager.php +++ b/lib/private/user/manager.php @@ -282,7 +282,11 @@ class Manager extends PublicEmitter { if ($backend->implementsActions(\OC_USER_BACKEND_COUNT_USERS)) { $backendusers = $backend->countUsers(); if($backendusers !== false) { - $userCountStatistics[get_class($backend)] = $backendusers; + if(isset($userCountStatistics[get_class($backend)])) { + $userCountStatistics[get_class($backend)] += $backendusers; + } else { + $userCountStatistics[get_class($backend)] = $backendusers; + } } } } From d7cb5ab080e2b3abe804ffe974ebb65398914943 Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Wed, 8 Jan 2014 13:26:48 +0100 Subject: [PATCH 059/293] add tests for user counting --- lib/private/user/dummy.php | 9 +++++ tests/lib/user/manager.php | 72 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+) diff --git a/lib/private/user/dummy.php b/lib/private/user/dummy.php index 52be7edfa7..fc15a630cf 100644 --- a/lib/private/user/dummy.php +++ b/lib/private/user/dummy.php @@ -123,4 +123,13 @@ class OC_User_Dummy extends OC_User_Backend { public function hasUserListings() { return true; } + + /** + * counts the users in the database + * + * @return int | bool + */ + public function countUsers() { + return 0; + } } diff --git a/tests/lib/user/manager.php b/tests/lib/user/manager.php index 00901dd411..ad1ac9e12f 100644 --- a/tests/lib/user/manager.php +++ b/tests/lib/user/manager.php @@ -346,4 +346,76 @@ class Manager extends \PHPUnit_Framework_TestCase { $manager->createUser('foo', 'bar'); } + + public function testCountUsersNoBackend() { + $manager = new \OC\User\Manager(); + + $result = $manager->countUsers(); + $this->assertTrue(is_array($result)); + $this->assertTrue(empty($result)); + } + + public function testCountUsersOneBackend() { + /** + * @var \OC_User_Dummy | \PHPUnit_Framework_MockObject_MockObject $backend + */ + $backend = $this->getMock('\OC_User_Dummy'); + $backend->expects($this->once()) + ->method('countUsers') + ->will($this->returnValue(7)); + + $backend->expects($this->once()) + ->method('implementsActions') + ->with(\OC_USER_BACKEND_COUNT_USERS) + ->will($this->returnValue(true)); + + $manager = new \OC\User\Manager(); + $manager->registerBackend($backend); + + $result = $manager->countUsers(); + $keys = array_keys($result); + $this->assertTrue(strpos($keys[0], 'Mock_OC_User_Dummy') !== false); + + $users = array_shift($result); + $this->assertEquals(7, $users); + } + + public function testCountUsersTwoBackends() { + /** + * @var \OC_User_Dummy | \PHPUnit_Framework_MockObject_MockObject $backend + */ + $backend1 = $this->getMock('\OC_User_Dummy'); + $backend1->expects($this->once()) + ->method('countUsers') + ->will($this->returnValue(7)); + + $backend1->expects($this->once()) + ->method('implementsActions') + ->with(\OC_USER_BACKEND_COUNT_USERS) + ->will($this->returnValue(true)); + + $backend2 = $this->getMock('\OC_User_Dummy'); + $backend2->expects($this->once()) + ->method('countUsers') + ->will($this->returnValue(16)); + + $backend2->expects($this->once()) + ->method('implementsActions') + ->with(\OC_USER_BACKEND_COUNT_USERS) + ->will($this->returnValue(true)); + + $manager = new \OC\User\Manager(); + $manager->registerBackend($backend1); + $manager->registerBackend($backend2); + + $result = $manager->countUsers(); + //because the backends have the same class name, only one value expected + $this->assertEquals(1, count($result)); + $keys = array_keys($result); + $this->assertTrue(strpos($keys[0], 'Mock_OC_User_Dummy') !== false); + + $users = array_shift($result); + //users from backends shall be summed up + $this->assertEquals(7+16, $users); + } } From be7837402d55abc9a6dc801c943c9b642e821dd0 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Wed, 8 Jan 2014 15:18:12 +0100 Subject: [PATCH 060/293] get the memorycache factory from OCP\Server instead of a cache instance this allows apps to specify a prefix to use --- lib/private/server.php | 11 +++++------ lib/public/cachefactory.php | 17 +++++++++++++++++ 2 files changed, 22 insertions(+), 6 deletions(-) create mode 100644 lib/public/cachefactory.php diff --git a/lib/private/server.php b/lib/private/server.php index 6b242bddd0..b5fa914862 100644 --- a/lib/private/server.php +++ b/lib/private/server.php @@ -136,10 +136,9 @@ class Server extends SimpleContainer implements IServerContainer { $this->registerService('UserCache', function($c) { return new UserCache(); }); - $this->registerService('MemCache', function ($c) { + $this->registerService('MemCacheFactory', function ($c) { $instanceId = \OC_Util::getInstanceId(); - $factory = new \OC\Memcache\Factory($instanceId); - return $factory->create(); + return new \OC\Memcache\Factory($instanceId); }); $this->registerService('ActivityManager', function($c) { return new ActivityManager(); @@ -303,10 +302,10 @@ class Server extends SimpleContainer implements IServerContainer { /** * Returns an ICache instance * - * @return \OCP\ICache + * @return \OCP\CacheFactory */ - function getMemCache() { - return $this->query('MemCache'); + function getMemCacheFactory() { + return $this->query('MemCacheFactory'); } /** diff --git a/lib/public/cachefactory.php b/lib/public/cachefactory.php new file mode 100644 index 0000000000..bb49aea7f3 --- /dev/null +++ b/lib/public/cachefactory.php @@ -0,0 +1,17 @@ + + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OCP; + +interface CacheFactory{ + /** + * @param string $prefix + * @return $return \OCP\ICache + */ + public function create($prefix = ''); +} From 5a2a0426a6c01cffe88c80e0529931a323c699d9 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Wed, 8 Jan 2014 15:51:40 +0100 Subject: [PATCH 061/293] Also update the OCP\IServerContainer --- lib/private/server.php | 2 +- lib/public/iservercontainer.php | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/private/server.php b/lib/private/server.php index b5fa914862..6b034a5be9 100644 --- a/lib/private/server.php +++ b/lib/private/server.php @@ -300,7 +300,7 @@ class Server extends SimpleContainer implements IServerContainer { } /** - * Returns an ICache instance + * Returns an \OCP\CacheFactory instance * * @return \OCP\CacheFactory */ diff --git a/lib/public/iservercontainer.php b/lib/public/iservercontainer.php index 7ac5049ef2..67884bdc3e 100644 --- a/lib/public/iservercontainer.php +++ b/lib/public/iservercontainer.php @@ -142,11 +142,11 @@ interface IServerContainer { function getCache(); /** - * Returns an ICache instance + * Returns an \OCP\CacheFactory instance * - * @return \OCP\ICache + * @return \OCP\CacheFactory */ - function getMemCache(); + function getMemCacheFactory(); /** * Returns the current session From e35bca1c266cbe1468da9b4a328e2521d00c30f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Wed, 8 Jan 2014 16:07:01 +0100 Subject: [PATCH 062/293] Fix ownCloud for php5.3.x --- lib/private/server.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/private/server.php b/lib/private/server.php index 5977ee9b5a..2cbd37a97d 100644 --- a/lib/private/server.php +++ b/lib/private/server.php @@ -128,7 +128,8 @@ class Server extends SimpleContainer implements IServerContainer { return new \OC\L10N\Factory(); }); $this->registerService('URLGenerator', function($c) { - $config = $this->getConfig(); + /** @var $c SimpleContainer */ + $config = $c->query('AllConfig'); return new \OC\URLGenerator($config); }); $this->registerService('AppHelper', function($c) { From 8eaa39f4e2fb7bb1036aca5727db320de00960e2 Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Wed, 8 Jan 2014 18:43:20 +0100 Subject: [PATCH 063/293] Removed special handling of part files in shared storage rename This fixes the issue introduced by the transfer id which itself wasn't taken into account by the shortcut code for part file in the shared storage class. --- apps/files_sharing/lib/sharedstorage.php | 33 +++++++++--------------- lib/private/connector/sabre/file.php | 5 +++- 2 files changed, 16 insertions(+), 22 deletions(-) diff --git a/apps/files_sharing/lib/sharedstorage.php b/apps/files_sharing/lib/sharedstorage.php index 3116cd717f..6b4db9763f 100644 --- a/apps/files_sharing/lib/sharedstorage.php +++ b/apps/files_sharing/lib/sharedstorage.php @@ -293,29 +293,20 @@ class Shared extends \OC\Files\Storage\Common { } public function rename($path1, $path2) { - // Check for partial files - if (pathinfo($path1, PATHINFO_EXTENSION) === 'part') { - if ($oldSource = $this->getSourcePath($path1)) { + // Renaming/moving is only allowed within shared folders + $pos1 = strpos($path1, '/', 1); + $pos2 = strpos($path2, '/', 1); + if ($pos1 !== false && $pos2 !== false && ($oldSource = $this->getSourcePath($path1))) { + $newSource = $this->getSourcePath(dirname($path2)) . '/' . basename($path2); + // Within the same folder, we only need UPDATE permissions + if (dirname($path1) == dirname($path2) and $this->isUpdatable($path1)) { list($storage, $oldInternalPath) = \OC\Files\Filesystem::resolvePath($oldSource); - $newInternalPath = substr($oldInternalPath, 0, -5); + list(, $newInternalPath) = \OC\Files\Filesystem::resolvePath($newSource); return $storage->rename($oldInternalPath, $newInternalPath); - } - } else { - // Renaming/moving is only allowed within shared folders - $pos1 = strpos($path1, '/', 1); - $pos2 = strpos($path2, '/', 1); - if ($pos1 !== false && $pos2 !== false && ($oldSource = $this->getSourcePath($path1))) { - $newSource = $this->getSourcePath(dirname($path2)) . '/' . basename($path2); - // Within the same folder, we only need UPDATE permissions - if (dirname($path1) == dirname($path2) and $this->isUpdatable($path1)) { - list($storage, $oldInternalPath) = \OC\Files\Filesystem::resolvePath($oldSource); - list(, $newInternalPath) = \OC\Files\Filesystem::resolvePath($newSource); - return $storage->rename($oldInternalPath, $newInternalPath); - // otherwise DELETE and CREATE permissions required - } elseif ($this->isDeletable($path1) && $this->isCreatable(dirname($path2))) { - $rootView = new \OC\Files\View(''); - return $rootView->rename($oldSource, $newSource); - } + // otherwise DELETE and CREATE permissions required + } elseif ($this->isDeletable($path1) && $this->isCreatable(dirname($path2))) { + $rootView = new \OC\Files\View(''); + return $rootView->rename($oldSource, $newSource); } } return false; diff --git a/lib/private/connector/sabre/file.php b/lib/private/connector/sabre/file.php index 53524ec9e5..c3b5900729 100644 --- a/lib/private/connector/sabre/file.php +++ b/lib/private/connector/sabre/file.php @@ -242,7 +242,10 @@ class OC_Connector_Sabre_File extends OC_Connector_Sabre_Node implements Sabre_D $fileExists = $fs->file_exists($targetPath); if ($renameOkay === false || $fileExists === false) { \OC_Log::write('webdav', '\OC\Files\Filesystem::rename() failed', \OC_Log::ERROR); - $fs->unlink($targetPath); + // only delete if an error occurred and the target file was already created + if ($fileExists) { + $fs->unlink($targetPath); + } throw new Sabre_DAV_Exception(); } From 4585b4ea3f1fd21aabc167102e74a382dfa0cbd8 Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Wed, 8 Jan 2014 19:41:10 +0100 Subject: [PATCH 064/293] Infowarning about 32bit --- lib/private/user/backend.php | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/private/user/backend.php b/lib/private/user/backend.php index 6969ce4ba3..f4e5618e04 100644 --- a/lib/private/user/backend.php +++ b/lib/private/user/backend.php @@ -39,6 +39,7 @@ define('OC_USER_BACKEND_GET_DISPLAYNAME', 0x00010000); define('OC_USER_BACKEND_SET_DISPLAYNAME', 0x00100000); define('OC_USER_BACKEND_PROVIDE_AVATAR', 0x01000000); define('OC_USER_BACKEND_COUNT_USERS', 0x10000000); +//more actions cannot be defined without breaking 32bit platforms! /** * Abstract base class for user management. Provides methods for querying backend From 9b7c3a5c66a9f987ff572aaece2ef6e895bf4ab6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Thu, 9 Jan 2014 10:27:47 +0100 Subject: [PATCH 065/293] fixing PHPDoc and use cameCase names --- lib/private/user/session.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/private/user/session.php b/lib/private/user/session.php index c2885d0041..1e299416fb 100644 --- a/lib/private/user/session.php +++ b/lib/private/user/session.php @@ -115,13 +115,13 @@ class Session implements Emitter, \OCP\IUserSession { /** * set the login name * - * @param string login name for the logged in user + * @param string $loginName for the logged in user */ - public function setLoginname($loginname) { - if (is_null($loginname)) { + public function setLoginName($loginName) { + if (is_null($loginName)) { $this->session->remove('loginname'); } else { - $this->session->set('loginname', $loginname); + $this->session->set('loginname', $loginName); } } @@ -130,7 +130,7 @@ class Session implements Emitter, \OCP\IUserSession { * * @return string */ - public function getLoginname() { + public function getLoginName() { if ($this->activeUser) { return $this->session->get('loginname'); } else { @@ -158,7 +158,7 @@ class Session implements Emitter, \OCP\IUserSession { if (!is_null($user)) { if ($user->isEnabled()) { $this->setUser($user); - $this->setLoginname($uid); + $this->setLoginName($uid); $this->manager->emit('\OC\User', 'postLogin', array($user, $password)); return true; } else { @@ -176,7 +176,7 @@ class Session implements Emitter, \OCP\IUserSession { public function logout() { $this->manager->emit('\OC\User', 'logout'); $this->setUser(null); - $this->setLoginname(null); + $this->setLoginName(null); $this->unsetMagicInCookie(); } From 22bd69f75cc91a79653038d20143aff9ee8b226a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Thu, 9 Jan 2014 10:28:24 +0100 Subject: [PATCH 066/293] set login name within apache auth backend --- lib/private/user.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/private/user.php b/lib/private/user.php index e0d6b9f3f5..98ebebbe5c 100644 --- a/lib/private/user.php +++ b/lib/private/user.php @@ -246,6 +246,8 @@ class OC_User { session_regenerate_id(true); self::setUserId($uid); self::setDisplayName($uid); + self::getUserSession()->setLoginName($uid); + OC_Hook::emit( "OC_User", "post_login", array( "uid" => $uid, 'password'=>'' )); return true; } From c3829dfa61ce9d884f8c7d9c81381ac5987e8250 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Thu, 9 Jan 2014 10:29:21 +0100 Subject: [PATCH 067/293] rename user-id to loginname to stay consistent --- lib/base.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/base.php b/lib/base.php index a8e9e90184..f30575c7b1 100644 --- a/lib/base.php +++ b/lib/base.php @@ -544,12 +544,12 @@ class OC { OC_User::useBackend(new OC_User_Database()); OC_Group::useBackend(new OC_Group_Database()); - if (isset($_SERVER['PHP_AUTH_USER']) && self::$session->exists('user_id') + if (isset($_SERVER['PHP_AUTH_USER']) && self::$session->exists('loginname') && $_SERVER['PHP_AUTH_USER'] !== self::$session->get('loginname')) { $sessionUser = self::$session->get('loginname'); $serverUser = $_SERVER['PHP_AUTH_USER']; OC_Log::write('core', - "Session user-id ($sessionUser) doesn't match SERVER[PHP_AUTH_USER] ($serverUser).", + "Session loginname ($sessionUser) doesn't match SERVER[PHP_AUTH_USER] ($serverUser).", OC_Log::WARN); OC_User::logout(); } From 76a7ae77a8ca18f8fcac03099b6e53cc8838ea31 Mon Sep 17 00:00:00 2001 From: Jan-Christoph Borchardt Date: Thu, 9 Jan 2014 10:54:23 +0100 Subject: [PATCH 068/293] fix email template l10n, emphasize filename --- core/templates/mail.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/templates/mail.php b/core/templates/mail.php index 4fa54aa528..b8b0a2bfe9 100644 --- a/core/templates/mail.php +++ b/core/templates/mail.php @@ -12,7 +12,7 @@   t('Hey there,

just letting you know that %s shared »%s« with you.
View it!

', array($_['user_displayname'], $_['filename'], $_['link']))); +print_unescaped($l->t('Hey there,

just letting you know that %s shared %s with you.
View it!

', array($_['user_displayname'], $_['filename'], $_['link']))); if ( isset($_['expiration']) ) { p($l->t("The share will expire on %s.", array($_['expiration']))); print_unescaped('

'); From d50c7391d8e78c9555b073fb9ccc6a91d5da34bc Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Thu, 9 Jan 2014 13:54:50 +0100 Subject: [PATCH 069/293] Use $server->getMemCacheFactory() in ldap connection --- apps/user_ldap/lib/connection.php | 2 +- lib/public/cachefactory.php | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/apps/user_ldap/lib/connection.php b/apps/user_ldap/lib/connection.php index 14dfaa1174..92168a09ff 100644 --- a/apps/user_ldap/lib/connection.php +++ b/apps/user_ldap/lib/connection.php @@ -51,7 +51,7 @@ class Connection extends LDAPUtility { $this->configPrefix = $configPrefix; $this->configID = $configID; $this->configuration = new Configuration($configPrefix); - $memcache = new \OC\Memcache\Factory(); + $memcache = \OC::$server->getMemCacheFactory(); if($memcache->isAvailable()) { $this->cache = $memcache->create(); } else { diff --git a/lib/public/cachefactory.php b/lib/public/cachefactory.php index bb49aea7f3..1bb0ea3dd5 100644 --- a/lib/public/cachefactory.php +++ b/lib/public/cachefactory.php @@ -10,8 +10,17 @@ namespace OCP; interface CacheFactory{ /** + * Get a memory cache instance + * * @param string $prefix * @return $return \OCP\ICache */ public function create($prefix = ''); + + /** + * Check if a memory cache backend is available + * + * @return bool + */ + public function isAvailable(); } From 4faba49f0a38427e96ef8393900f799c5a5ba6aa Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Thu, 9 Jan 2014 17:27:55 +0100 Subject: [PATCH 070/293] Fix calculated folder size to use unencrypted size The encrypted size was used when calculating folder sizes. This fix now also sums up the unencrypted size and shows that one when available. --- lib/private/files/cache/cache.php | 22 +++++++++++---- tests/lib/files/cache/cache.php | 45 +++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 5 deletions(-) diff --git a/lib/private/files/cache/cache.php b/lib/private/files/cache/cache.php index 8e682a96b7..1e7936ca26 100644 --- a/lib/private/files/cache/cache.php +++ b/lib/private/files/cache/cache.php @@ -178,7 +178,7 @@ class Cache { if ($file['storage_mtime'] == 0) { $file['storage_mtime'] = $file['mtime']; } - if ($file['encrypted']) { + if ($file['encrypted'] or ($file['unencrypted_size'] > 0 and $file['mimetype'] === 'httpd/unix-directory')) { $file['encrypted_size'] = $file['size']; $file['size'] = $file['unencrypted_size']; } @@ -511,22 +511,34 @@ class Cache { $entry = $this->get($path); if ($entry && $entry['mimetype'] === 'httpd/unix-directory') { $id = $entry['fileid']; - $sql = 'SELECT SUM(`size`) AS f1, MIN(`size`) AS f2 FROM `*PREFIX*filecache` '. + $sql = 'SELECT SUM(`size`) AS f1, MIN(`size`) AS f2, ' . + 'SUM(`unencrypted_size`) AS f3 ' . + 'FROM `*PREFIX*filecache` ' . 'WHERE `parent` = ? AND `storage` = ?'; $result = \OC_DB::executeAudited($sql, array($id, $this->getNumericStorageId())); if ($row = $result->fetchRow()) { - list($sum, $min) = array_values($row); + list($sum, $min, $unencryptedSum) = array_values($row); $sum = (int)$sum; $min = (int)$min; + $unencryptedSum = (int)$unencryptedSum; if ($min === -1) { $totalSize = $min; } else { $totalSize = $sum; } + $update = array(); if ($entry['size'] !== $totalSize) { - $this->update($id, array('size' => $totalSize)); + $update['size'] = $totalSize; + } + if ($entry['unencrypted_size'] !== $unencryptedSum) { + $update['unencrypted_size'] = $unencryptedSum; + } + if (count($update) > 0) { + $this->update($id, $update); + } + if ($totalSize !== -1 and $unencryptedSum > 0) { + $totalSize = $unencryptedSum; } - } } return $totalSize; diff --git a/tests/lib/files/cache/cache.php b/tests/lib/files/cache/cache.php index 052d70dd0b..7d9329328a 100644 --- a/tests/lib/files/cache/cache.php +++ b/tests/lib/files/cache/cache.php @@ -137,6 +137,51 @@ class Cache extends \PHPUnit_Framework_TestCase { $this->assertFalse($this->cache->inCache('folder/bar')); } + public function testEncryptedFolder() { + $file1 = 'folder'; + $file2 = 'folder/bar'; + $file3 = 'folder/foo'; + $data1 = array('size' => 100, 'mtime' => 50, 'mimetype' => 'httpd/unix-directory'); + $fileData = array(); + $fileData['bar'] = array('size' => 1000, 'unencrypted_size' => 900, 'encrypted' => 1, 'mtime' => 20, 'mimetype' => 'foo/file'); + $fileData['foo'] = array('size' => 20, 'unencrypted_size' => 16, 'encrypted' => 1, 'mtime' => 25, 'mimetype' => 'foo/file'); + + $this->cache->put($file1, $data1); + $this->cache->put($file2, $fileData['bar']); + $this->cache->put($file3, $fileData['foo']); + + $content = $this->cache->getFolderContents($file1); + $this->assertEquals(count($content), 2); + foreach ($content as $cachedData) { + $data = $fileData[$cachedData['name']]; + // indirect retrieval swaps unencrypted_size and size + $this->assertEquals($data['unencrypted_size'], $cachedData['size']); + } + + $file4 = 'folder/unkownSize'; + $fileData['unkownSize'] = array('size' => -1, 'mtime' => 25, 'mimetype' => 'foo/file'); + $this->cache->put($file4, $fileData['unkownSize']); + + $this->assertEquals(-1, $this->cache->calculateFolderSize($file1)); + + $fileData['unkownSize'] = array('size' => 5, 'mtime' => 25, 'mimetype' => 'foo/file'); + $this->cache->put($file4, $fileData['unkownSize']); + + $this->assertEquals(916, $this->cache->calculateFolderSize($file1)); + // direct cache entry retrieval returns the original values + $this->assertEquals(1025, $this->cache->get($file1)['size']); + $this->assertEquals(916, $this->cache->get($file1)['unencrypted_size']); + + $this->cache->remove($file2); + $this->cache->remove($file3); + $this->cache->remove($file4); + $this->assertEquals(0, $this->cache->calculateFolderSize($file1)); + + $this->cache->remove('folder'); + $this->assertFalse($this->cache->inCache('folder/foo')); + $this->assertFalse($this->cache->inCache('folder/bar')); + } + public function testRootFolderSizeForNonHomeStorage() { $dir1 = 'knownsize'; $dir2 = 'unknownsize'; From 320353c237fbee2d9a8f12dd474feb3a0f6ddec6 Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Mon, 9 Dec 2013 01:34:31 +0100 Subject: [PATCH 071/293] Add support for multiple memcached servers. --- config/config.sample.php | 10 ++++++++-- lib/private/memcache/memcached.php | 4 ++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/config/config.sample.php b/config/config.sample.php index 1070ef72ed..67152accc3 100755 --- a/config/config.sample.php +++ b/config/config.sample.php @@ -114,8 +114,14 @@ $CONFIG = array( /* Password to use for sendmail mail, depends on mail_smtpauth if this is used */ "mail_smtppassword" => "", -/* memcached hostname and port (Only used when xCache, APC and APCu are absent.) */ -"memcached_server" => array('localhost', 11211), +/* memcached servers (Only used when xCache, APC and APCu are absent.) */ +"memcached_servers" => array( + // hostname, port and optional weight. Also see: + // http://www.php.net/manual/en/memcached.addservers.php + // http://www.php.net/manual/en/memcached.addserver.php + array('localhost', 11211), + //array('other.host.local', 11211), +), /* How long should ownCloud keep deleted files in the trash bin, default value: 30 days */ 'trashbin_retention_obligation' => 30, diff --git a/lib/private/memcache/memcached.php b/lib/private/memcache/memcached.php index 978e6c2eff..13b1867231 100644 --- a/lib/private/memcache/memcached.php +++ b/lib/private/memcache/memcached.php @@ -18,8 +18,8 @@ class Memcached extends Cache { parent::__construct($prefix); if (is_null(self::$cache)) { self::$cache = new \Memcached(); - list($host, $port) = \OC_Config::getValue('memcached_server', array('localhost', 11211)); - self::$cache->addServer($host, $port); + $servers = \OC_Config::getValue('memcached_servers', array(array('localhost', 11211))); + self::$cache->addServers($servers); } } From acd81f6c694373a18a0ee9ba29075b9924603c25 Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Fri, 10 Jan 2014 00:57:40 +0100 Subject: [PATCH 072/293] Readd support for memcached_server config variable. --- lib/private/memcache/memcached.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/private/memcache/memcached.php b/lib/private/memcache/memcached.php index 13b1867231..075828eeba 100644 --- a/lib/private/memcache/memcached.php +++ b/lib/private/memcache/memcached.php @@ -18,7 +18,15 @@ class Memcached extends Cache { parent::__construct($prefix); if (is_null(self::$cache)) { self::$cache = new \Memcached(); - $servers = \OC_Config::getValue('memcached_servers', array(array('localhost', 11211))); + $servers = \OC_Config::getValue('memcached_servers'); + if (!$servers) { + $server = \OC_Config::getValue('memcached_server'); + if ($server) { + $servers = array($server); + } else { + $servers = array(array('localhost', 11211)); + } + } self::$cache->addServers($servers); } } From 30f77f53d5c97e369a879eab9381b856a5caf79c Mon Sep 17 00:00:00 2001 From: ben-denham Date: Fri, 10 Jan 2014 14:08:29 +1300 Subject: [PATCH 073/293] updated the unit test for OCP\Share::unshareAll() to verify that shares by all users are removed for an item. --- tests/lib/share/share.php | 58 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 54 insertions(+), 4 deletions(-) diff --git a/tests/lib/share/share.php b/tests/lib/share/share.php index 84e2e5c63e..2fe2837019 100644 --- a/tests/lib/share/share.php +++ b/tests/lib/share/share.php @@ -149,6 +149,26 @@ class Test_Share extends PHPUnit_Framework_TestCase { ); } + protected function shareUserTestFileWithUser($sharer, $receiver) { + OC_User::setUserId($sharer); + $this->assertTrue( + OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $receiver, OCP\PERMISSION_READ | OCP\PERMISSION_SHARE), + 'Failed asserting that ' . $sharer . ' successfully shared text.txt with ' . $receiver . '.' + ); + $this->assertContains( + 'test.txt', + OCP\Share::getItemShared('test', 'test.txt', Test_Share_Backend::FORMAT_SOURCE), + 'Failed asserting that test.txt is a shared file of ' . $sharer . '.' + ); + + OC_User::setUserId($receiver); + $this->assertContains( + 'test.txt', + OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_SOURCE), + 'Failed asserting that ' . $receiver . ' has access to test.txt after initial sharing.' + ); + } + public function testShareWithUser() { // Invalid shares $message = 'Sharing test.txt failed, because the user '.$this->user1.' is the item owner'; @@ -585,25 +605,55 @@ class Test_Share extends PHPUnit_Framework_TestCase { } public function testUnshareAll() { - $this->shareUserOneTestFileWithUserTwo(); + $this->shareUserTestFileWithUser($this->user1, $this->user2); + $this->shareUserTestFileWithUser($this->user2, $this->user3); + $this->shareUserTestFileWithUser($this->user3, $this->user4); $this->shareUserOneTestFileWithGroupOne(); OC_User::setUserId($this->user1); $this->assertEquals( array('test.txt', 'test.txt'), OCP\Share::getItemsShared('test', 'test.txt'), - 'Failed asserting that the test.txt file is shared exactly two times.' + 'Failed asserting that the test.txt file is shared exactly two times by user1.' + ); + + OC_User::setUserId($this->user2); + $this->assertEquals( + array('test.txt'), + OCP\Share::getItemsShared('test', 'test.txt'), + 'Failed asserting that the test.txt file is shared exactly once by user2.' + ); + + OC_User::setUserId($this->user3); + $this->assertEquals( + array('test.txt'), + OCP\Share::getItemsShared('test', 'test.txt'), + 'Failed asserting that the test.txt file is shared exactly once by user3.' ); $this->assertTrue( OCP\Share::unshareAll('test', 'test.txt'), - 'Failed asserting that user 1 successfully unshared all shares of the test.txt share.' + 'Failed asserting that user 3 successfully unshared all shares of the test.txt share.' ); $this->assertEquals( array(), OCP\Share::getItemsShared('test'), - 'Failed asserting that both shares of the test.txt file have been removed.' + 'Failed asserting that the share of the test.txt file by user 3 has been removed.' + ); + + OC_User::setUserId($this->user1); + $this->assertEquals( + array(), + OCP\Share::getItemsShared('test'), + 'Failed asserting that both shares of the test.txt file by user 1 have been removed.' + ); + + OC_User::setUserId($this->user2); + $this->assertEquals( + array(), + OCP\Share::getItemsShared('test'), + 'Failed asserting that the share of the test.txt file by user 2 has been removed.' ); } } From 2abea964625713180d811e4fd1cfd25a92ee2c88 Mon Sep 17 00:00:00 2001 From: Joan Date: Fri, 10 Jan 2014 09:33:35 +0100 Subject: [PATCH 074/293] Disabled internet checking as mentioned when in proxy mode --- lib/private/util.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/private/util.php b/lib/private/util.php index c0e618cc86..9b37dccb50 100755 --- a/lib/private/util.php +++ b/lib/private/util.php @@ -892,6 +892,11 @@ class OC_Util { return false; } + // in case the connection is via proxy return true to avoid connecting to owncloud.org + if(OC_Config::getValue('proxy', '') != '') { + return true; + } + // try to connect to owncloud.org to see if http connections to the internet are possible. $connected = @fsockopen("www.owncloud.org", 80); if ($connected) { From 3ae17d0785e27528ce221e9c906df3127daa35fa Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Tue, 10 Dec 2013 01:45:15 +0100 Subject: [PATCH 075/293] Fix unallowed child elements --- core/templates/layout.user.php | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/core/templates/layout.user.php b/core/templates/layout.user.php index 89987625d6..dd2b209244 100644 --- a/core/templates/layout.user.php +++ b/core/templates/layout.user.php @@ -48,15 +48,16 @@ <?php p($theme->getName()); ?> - +
From d95cab632b167c597c10da59d3b44715a9e6c2b4 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Tue, 10 Dec 2013 01:58:19 +0100 Subject: [PATCH 076/293] Extend margin to avoid displaying a scrollbar --- 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 df01456708..ea98fbadb6 100644 --- a/core/css/styles.css +++ b/core/css/styles.css @@ -671,7 +671,7 @@ label.infield { cursor:text !important; top:1.05em; left:.85em; } /* Apps management as sticky footer, less obtrusive in the list */ #navigation .wrapper { min-height: 100%; - margin: 0 auto -72px; + margin: 0 auto -82px 0; } #apps-management, #navigation .push { height: 72px; From 17c00f34d38d5d51f03ae1cf35d042df8eda8820 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Tue, 10 Dec 2013 01:46:20 +0100 Subject: [PATCH 077/293] Add alt attribute for img elements --- core/templates/layout.user.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/templates/layout.user.php b/core/templates/layout.user.php index dd2b209244..bc1c700402 100644 --- a/core/templates/layout.user.php +++ b/core/templates/layout.user.php @@ -51,7 +51,7 @@
- +
@@ -91,7 +91,7 @@
  • class="active"> - + @@ -110,7 +110,7 @@
  • class="active"> - + t('Apps')); ?> From 1042733634622b234beb52e24505d56a9883b4eb Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Fri, 10 Jan 2014 15:02:26 +0100 Subject: [PATCH 078/293] Fixed various file name escaping issues in core apps - Refactored file tr lookup into FileList.findFileEl that uses filterAttr to avoid escaping issues in jQuery selectors - Fixed versions and sharing app to properly escape file names in attributes --- apps/files/js/file-upload.js | 12 ++++++-- apps/files/js/fileactions.js | 2 +- apps/files/js/filelist.js | 49 ++++++++++++++++++------------ apps/files/js/files.js | 14 +++++---- apps/files_sharing/js/public.js | 6 ++-- apps/files_sharing/js/share.js | 2 +- apps/files_trashbin/js/trash.js | 14 ++++----- apps/files_versions/js/versions.js | 16 +++++----- core/js/share.js | 10 ++++-- 9 files changed, 75 insertions(+), 50 deletions(-) diff --git a/apps/files/js/file-upload.js b/apps/files/js/file-upload.js index 196817432d..225c331910 100644 --- a/apps/files/js/file-upload.js +++ b/apps/files/js/file-upload.js @@ -222,6 +222,14 @@ $(document).ready(function() { //examine file var file = data.files[0]; + try { + // FIXME: not so elegant... need to refactor that method to return a value + Files.isFileNameValid(file.name); + } + catch (errorMessage) { + data.textStatus = 'invalidcharacters'; + data.errorThrown = errorMessage; + } if (file.type === '' && file.size === 4096) { data.textStatus = 'dirorzero'; @@ -605,7 +613,7 @@ $(document).ready(function() { if (result.status === 'success') { var date=new Date(); FileList.addDir(name, 0, date, hidden); - var tr=$('tr[data-file="'+name+'"]'); + var tr = FileList.findFileEl(name); tr.attr('data-id', result.data.id); } else { OC.dialogs.alert(result.data.message, t('core', 'Could not create folder')); @@ -647,7 +655,7 @@ $(document).ready(function() { $('#uploadprogressbar').fadeOut(); var date = new Date(); FileList.addFile(localName, size, date, false, hidden); - var tr = $('tr[data-file="'+localName+'"]'); + var tr = FileList.findFileEl(localName); tr.data('mime', mime).data('id', id); tr.attr('data-id', id); var path = $('#dir').val()+'/'+localName; diff --git a/apps/files/js/fileactions.js b/apps/files/js/fileactions.js index 03e23189a9..74bb711ef3 100644 --- a/apps/files/js/fileactions.js +++ b/apps/files/js/fileactions.js @@ -71,7 +71,7 @@ var FileActions = { FileActions.currentFile = parent; var actions = FileActions.get(FileActions.getCurrentMimeType(), FileActions.getCurrentType(), FileActions.getCurrentPermissions()); var file = FileActions.getCurrentFile(); - if ($('tr[data-file="'+file+'"]').data('renaming')) { + if (FileList.findFileEl(file).data('renaming')) { return; } diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js index 473bcf25f2..c02ab70ce8 100644 --- a/apps/files/js/filelist.js +++ b/apps/files/js/filelist.js @@ -6,6 +6,13 @@ var FileList={ $(this).attr('data-file',decodeURIComponent($(this).attr('data-file'))); }); }, + /** + * Returns the tr element for a given file name + */ + findFileEl: function(fileName){ + // use filterAttr to avoid escaping issues + return $('#fileList tr').filterAttr('data-file', fileName); + }, update:function(fileListHtml) { var $fileList = $('#fileList'); $fileList.empty().html(fileListHtml); @@ -292,8 +299,9 @@ var FileList={ $('#filestable').toggleClass('hidden', show); }, remove:function(name){ - $('tr').filterAttr('data-file',name).find('td.filename').draggable('destroy'); - $('tr').filterAttr('data-file',name).remove(); + var fileEl = FileList.findFileEl(name); + fileEl.find('td.filename').draggable('destroy'); + fileEl.remove(); FileList.updateFileSummary(); if ( ! $('tr[data-file]').exists() ) { $('#emptycontent').removeClass('hidden'); @@ -334,7 +342,7 @@ var FileList={ FileList.updateFileSummary(); }, loadingDone:function(name, id) { - var mime, tr = $('tr[data-file="'+name+'"]'); + var mime, tr = FileList.findFileEl(name); tr.data('loading', false); mime = tr.data('mime'); tr.attr('data-mime', mime); @@ -347,12 +355,12 @@ var FileList={ }, null, null, tr.attr('data-etag')); tr.find('td.filename').draggable(dragOptions); }, - isLoading:function(name) { - return $('tr[data-file="'+name+'"]').data('loading'); + isLoading:function(file) { + return FileList.findFileEl(file).data('loading'); }, rename:function(oldname) { var tr, td, input, form; - tr = $('tr[data-file="'+oldname+'"]'); + tr = FileList.findFileEl(oldname); tr.data('renaming',true); td = tr.children('td.filename'); input = $('').val(oldname); @@ -500,14 +508,16 @@ var FileList={ form.trigger('submit'); }); }, - inList:function(filename) { - return $('#fileList tr[data-file="'+filename+'"]').length; + inList:function(file) { + return FileList.findFileEl(file).length; }, replace:function(oldName, newName, isNewFile) { // Finish any existing actions - $('tr[data-file="'+oldName+'"]').hide(); - $('tr[data-file="'+newName+'"]').hide(); - var tr = $('tr[data-file="'+oldName+'"]').clone(); + var oldFileEl = FileList.findFileEl(oldName); + var newFileEl = FileList.findFileEl(newName); + oldFileEl.hide(); + newFileEl.hide(); + var tr = oldFileEl.clone(); tr.attr('data-replace', 'true'); tr.attr('data-file', newName); var td = tr.children('td.filename'); @@ -559,7 +569,7 @@ var FileList={ files=[files]; } for (var i=0; i span').attr('data-oldName'); + FileList.findFileEl(file).show(); OC.Notification.hide(); }); $('#notification:first-child').on('click', '.cancel', function() { diff --git a/apps/files/js/files.js b/apps/files/js/files.js index fdaa3aa334..1f12ade8d7 100644 --- a/apps/files/js/files.js +++ b/apps/files/js/files.js @@ -282,7 +282,7 @@ $(document).ready(function() { procesSelection(); } else { var filename=$(this).parent().parent().attr('data-file'); - var tr=$('tr[data-file="'+filename+'"]'); + var tr = FileList.findFileEl(filename); var renaming=tr.data('renaming'); if (!renaming && !FileList.isLoading(filename)) { FileActions.currentFile = $(this).parent(); @@ -541,10 +541,12 @@ var folderDropOptions={ if (result) { if (result.status === 'success') { //recalculate folder size - var oldSize = $('#fileList tr[data-file="'+target+'"]').data('size'); - var newSize = oldSize + $('#fileList tr[data-file="'+file+'"]').data('size'); - $('#fileList tr[data-file="'+target+'"]').data('size', newSize); - $('#fileList tr[data-file="'+target+'"]').find('td.filesize').text(humanFileSize(newSize)); + var oldFile = FileList.findFileEl(target); + var newFile = FileList.findFileEl(file); + var oldSize = oldFile.data('size'); + var newSize = oldSize + newFile.data('size'); + oldFile.data('size', newSize); + oldFile.find('td.filesize').text(humanFileSize(newSize)); FileList.remove(file); procesSelection(); @@ -738,7 +740,7 @@ Files.lazyLoadPreview = function(path, mime, ready, width, height, etag) { } function getUniqueName(name) { - if ($('tr[data-file="'+name+'"]').exists()) { + if (FileList.findFileEl(name).exists()) { var parts=name.split('.'); var extension = ""; if (parts.length > 1) { diff --git a/apps/files_sharing/js/public.js b/apps/files_sharing/js/public.js index eacd4096ed..2e34e6f9bc 100644 --- a/apps/files_sharing/js/public.js +++ b/apps/files_sharing/js/public.js @@ -29,19 +29,19 @@ $(document).ready(function() { } } FileActions.register('dir', 'Open', OC.PERMISSION_READ, '', function(filename) { - var tr = $('tr').filterAttr('data-file', filename); + var tr = FileList.findFileEl(filename); if (tr.length > 0) { window.location = $(tr).find('a.name').attr('href'); } }); FileActions.register('file', 'Download', OC.PERMISSION_READ, '', function(filename) { - var tr = $('tr').filterAttr('data-file', filename); + var tr = FileList.findFileEl(filename); if (tr.length > 0) { window.location = $(tr).find('a.name').attr('href'); } }); FileActions.register('dir', 'Download', OC.PERMISSION_READ, '', function(filename) { - var tr = $('tr').filterAttr('data-file', filename); + var tr = FileList.findFileEl(filename); if (tr.length > 0) { window.location = $(tr).find('a.name').attr('href')+'&download'; } diff --git a/apps/files_sharing/js/share.js b/apps/files_sharing/js/share.js index 340e093944..36de452a55 100644 --- a/apps/files_sharing/js/share.js +++ b/apps/files_sharing/js/share.js @@ -22,7 +22,7 @@ $(document).ready(function() { } else { var item = $('#dir').val() + '/' + filename; } - var tr = $('tr').filterAttr('data-file', filename); + var tr = FileList.findFileEl(filename); if ($(tr).data('type') == 'dir') { var itemType = 'folder'; } else { diff --git a/apps/files_trashbin/js/trash.js b/apps/files_trashbin/js/trash.js index 1ff5bac613..46d8b56308 100644 --- a/apps/files_trashbin/js/trash.js +++ b/apps/files_trashbin/js/trash.js @@ -3,8 +3,8 @@ $(document).ready(function() { if (typeof FileActions !== 'undefined') { FileActions.register('all', 'Restore', OC.PERMISSION_READ, OC.imagePath('core', 'actions/history'), function(filename) { - var tr = $('tr').filterAttr('data-file', filename); - var deleteAction = $('tr').filterAttr('data-file', filename).children("td.date").children(".action.delete"); + var tr = FileList.findFileEl(filename); + var deleteAction = tr.children("td.date").children(".action.delete"); deleteAction.removeClass('delete-icon').addClass('progress-icon'); disableActions(); $.post(OC.filePath('files_trashbin', 'ajax', 'undelete.php'), @@ -30,8 +30,8 @@ $(document).ready(function() { return OC.imagePath('core', 'actions/delete'); }, function(filename) { $('.tipsy').remove(); - var tr = $('tr').filterAttr('data-file', filename); - var deleteAction = $('tr').filterAttr('data-file', filename).children("td.date").children(".action.delete"); + var tr = FileList.findFileEl(filename); + var deleteAction = tr.children("td.date").children(".action.delete"); deleteAction.removeClass('delete-icon').addClass('progress-icon'); disableActions(); $.post(OC.filePath('files_trashbin', 'ajax', 'delete.php'), @@ -73,7 +73,7 @@ $(document).ready(function() { var dirlisting = getSelectedFiles('dirlisting')[0]; disableActions(); for (var i = 0; i < files.length; i++) { - var deleteAction = $('tr').filterAttr('data-file', files[i]).children("td.date").children(".action.delete"); + var deleteAction = FileList.findFileEl(files[i]).children("td.date").children(".action.delete"); deleteAction.removeClass('delete-icon').addClass('progress-icon'); } @@ -119,7 +119,7 @@ $(document).ready(function() { } else { for (var i = 0; i < files.length; i++) { - var deleteAction = $('tr').filterAttr('data-file', files[i]).children("td.date").children(".action.delete"); + var deleteAction = FileList.findFileEl(files[i]).children("td.date").children(".action.delete"); deleteAction.removeClass('delete-icon').addClass('progress-icon'); } } @@ -169,7 +169,7 @@ $(document).ready(function() { event.preventDefault(); } var filename = $(this).parent().parent().attr('data-file'); - var tr = $('tr').filterAttr('data-file',filename); + var tr = FileList.findFileEl(filename); var renaming = tr.data('renaming'); if(!renaming && !FileList.isLoading(filename)){ if(mime.substr(0, 5) === 'text/'){ //no texteditor for now diff --git a/apps/files_versions/js/versions.js b/apps/files_versions/js/versions.js index 738a7ece6f..4adf14745d 100644 --- a/apps/files_versions/js/versions.js +++ b/apps/files_versions/js/versions.js @@ -77,6 +77,7 @@ function goToVersionPage(url){ function createVersionsDropdown(filename, files) { var start = 0; + var fileEl; var html = '