diff --git a/apps/files/appinfo/info.xml b/apps/files/appinfo/info.xml index 7c82c839da..3480037853 100644 --- a/apps/files/appinfo/info.xml +++ b/apps/files/appinfo/info.xml @@ -5,7 +5,7 @@ File Management AGPL Robin Appelman - 4.91 + 4.93 true diff --git a/apps/files/css/files.css b/apps/files/css/files.css index dfc2e4c0e2..3cd809038b 100644 --- a/apps/files/css/files.css +++ b/apps/files/css/files.css @@ -123,6 +123,24 @@ a.action>img { max-height:16px; max-width:16px; vertical-align:text-bottom; } .selectedActions a { display:inline; margin:-.5em 0; padding:.5em !important; } .selectedActions a img { position:relative; top:.3em; } +#fileList a.action { + display:none; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + opacity: 0; +} +#fileList tr:hover a.action { + display:inline; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=.5)"; + filter: alpha(opacity=.5); + opacity: .5; +} +#fileList tr:hover a.action:hover { + display:inline; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=1)"; + filter: alpha(opacity=1); + opacity: 1; +} #scanning-message{ top:40%; left:40%; position:absolute; display:none; } diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js index ea721059c3..f5f3f3ba0c 100644 --- a/apps/files/js/filelist.js +++ b/apps/files/js/filelist.js @@ -334,7 +334,7 @@ var FileList={ if (result.status == 'success') { $.each(files,function(index,file){ var files = $('tr').filterAttr('data-file',file); - files.hide(); + files.remove(); files.find('input[type="checkbox"]').removeAttr('checked'); files.removeClass('selected'); }); diff --git a/apps/files/js/files.js b/apps/files/js/files.js index 6801fb5991..464f770368 100644 --- a/apps/files/js/files.js +++ b/apps/files/js/files.js @@ -524,7 +524,7 @@ $(document).ready(function() { crumb.text(text); } - $(window).click(function(){ + $(document).click(function(){ $('#new>ul').hide(); $('#new').removeClass('active'); $('#new li').each(function(i,element){ @@ -595,7 +595,7 @@ $(document).ready(function() { var date=new Date(); FileList.addFile(name,0,date,false,hidden); var tr=$('tr').filterAttr('data-file',name); - tr.data('mime','text/plain').data('id',result.data.id); + tr.attr('data-mime','text/plain'); tr.attr('data-id', result.data.id); getMimeIcon('text/plain',function(path){ tr.find('td.filename').attr('style','background-image:url('+path+')'); @@ -863,6 +863,10 @@ var dragOptions={ $('#fileList tr td.filename').addClass('ui-draggable'); } } +// sane browsers support using the distance option +if ( ! $.browser.msie) { + dragOptions['distance'] = 20; +} var folderDropOptions={ drop: function( event, ui ) { diff --git a/apps/files/l10n/he.php b/apps/files/l10n/he.php index 442eafe1c0..ca2cb14027 100644 --- a/apps/files/l10n/he.php +++ b/apps/files/l10n/he.php @@ -8,6 +8,7 @@ "Missing a temporary folder" => "תיקייה זמנית חסרה", "Failed to write to disk" => "הכתיבה לכונן נכשלה", "Files" => "קבצים", +"Delete permanently" => "מחק לצמיתות", "Delete" => "מחיקה", "Rename" => "שינוי שם", "Pending" => "ממתין", diff --git a/apps/files_external/appinfo/info.xml b/apps/files_external/appinfo/info.xml index 2c04216a9f..0542b7b10a 100644 --- a/apps/files_external/appinfo/info.xml +++ b/apps/files_external/appinfo/info.xml @@ -5,7 +5,7 @@ Mount external storage sources AGPL Robin Appelman, Michael Gapczynski - 4.91 + 4.93 true diff --git a/apps/files_sharing/appinfo/info.xml b/apps/files_sharing/appinfo/info.xml index 1f24a4dde8..9a199281a7 100644 --- a/apps/files_sharing/appinfo/info.xml +++ b/apps/files_sharing/appinfo/info.xml @@ -5,7 +5,7 @@ File sharing between users AGPL Michael Gapczynski - 4.91 + 4.93 true diff --git a/apps/files_sharing/l10n/my_MM.php b/apps/files_sharing/l10n/my_MM.php new file mode 100644 index 0000000000..aa574b58b0 --- /dev/null +++ b/apps/files_sharing/l10n/my_MM.php @@ -0,0 +1,4 @@ + "စကားဝှက်", +"web services under your control" => "သင်၏ထိန်းချုပ်မှု့အောက်တွင်ရှိသော Web services" +); diff --git a/apps/files_sharing/lib/sharedstorage.php b/apps/files_sharing/lib/sharedstorage.php index c7521949da..5a9864b64b 100644 --- a/apps/files_sharing/lib/sharedstorage.php +++ b/apps/files_sharing/lib/sharedstorage.php @@ -315,7 +315,8 @@ class Shared extends \OC\Files\Storage\Common { if ($this->isCreatable(dirname($path2))) { $source = $this->fopen($path1, 'r'); $target = $this->fopen($path2, 'w'); - return \OC_Helper::streamCopy($source, $target); + list ($count, $result) = \OC_Helper::streamCopy($source, $target); + return $result; } return false; } diff --git a/apps/files_trashbin/appinfo/database.xml b/apps/files_trashbin/appinfo/database.xml index 1144a1c9a9..aae334b148 100644 --- a/apps/files_trashbin/appinfo/database.xml +++ b/apps/files_trashbin/appinfo/database.xml @@ -18,7 +18,7 @@ text true - 50 + 250 @@ -26,7 +26,7 @@ text true - 50 + 64 @@ -42,7 +42,7 @@ text true - 200 + 512 @@ -89,4 +89,30 @@ + + + *dbprefix*files_trashsize + + + + + user + text + + true + 64 + + + + size + text + + true + 50 + + + + +
+ diff --git a/apps/files_trashbin/appinfo/update.php b/apps/files_trashbin/appinfo/update.php new file mode 100644 index 0000000000..b0bf79cc51 --- /dev/null +++ b/apps/files_trashbin/appinfo/update.php @@ -0,0 +1,40 @@ +getAbsolutePath($dir); $dirContent = opendir($fullpath); $i = 0; @@ -96,6 +95,7 @@ $list->assign('disableDownloadActions', true); $tmpl->assign('breadcrumb', $breadcrumbNav->fetchPage(), false); $tmpl->assign('fileList', $list->fetchPage(), false); $tmpl->assign('files', $files); +$tmpl->assign('dirlisting', $dirlisting); $tmpl->assign('dir', OC_Filesystem::normalizePath($view->getAbsolutePath())); $tmpl->printPage(); diff --git a/apps/files_trashbin/l10n/he.php b/apps/files_trashbin/l10n/he.php index fe60eab7b7..9c767d2222 100644 --- a/apps/files_trashbin/l10n/he.php +++ b/apps/files_trashbin/l10n/he.php @@ -1,8 +1,16 @@ "בלתי אפשרי למחוק את %s לצמיתות", +"Couldn't restore %s" => "בלתי אפשרי לשחזר את %s", +"perform restore operation" => "בצע פעולת שחזור", +"delete file permanently" => "מחק קובץ לצמיתות", +"Delete permanently" => "מחק לצמיתות", "Name" => "שם", +"Deleted" => "נמחק", "1 folder" => "תיקייה אחת", "{count} folders" => "{count} תיקיות", "1 file" => "קובץ אחד", "{count} files" => "{count} קבצים", +"Nothing in here. Your trash bin is empty!" => "שום דבר כאן. סל המחזור שלך ריק!", +"Restore" => "שחזר", "Delete" => "מחיקה" ); diff --git a/apps/files_trashbin/lib/trash.php b/apps/files_trashbin/lib/trash.php index 8355c7252b..d4d5ad96cf 100644 --- a/apps/files_trashbin/lib/trash.php +++ b/apps/files_trashbin/lib/trash.php @@ -36,10 +36,12 @@ class Trashbin { */ public static function move2trash($file_path) { $user = \OCP\User::getUser(); - $view = new \OC_FilesystemView('/'. $user); + $view = new \OC\Files\View('/'. $user); if (!$view->is_dir('files_trashbin')) { $view->mkdir('files_trashbin'); - $view->mkdir("versions_trashbin"); + $view->mkdir("files_trashbin/files"); + $view->mkdir("files_trashbin/versions"); + $view->mkdir("files_trashbin/keyfiles"); } $path_parts = pathinfo($file_path); @@ -54,50 +56,61 @@ class Trashbin { } else { $type = 'file'; } - - if ( ($trashbinSize = \OCP\Config::getAppValue('files_trashbin', 'size')) === null ) { + + $trashbinSize = self::getTrashbinSize($user); + if ( $trashbinSize === false || $trashbinSize < 0 ) { $trashbinSize = self::calculateSize(new \OC_FilesystemView('/'. $user.'/files_trashbin')); - $trashbinSize += self::calculateSize(new \OC_FilesystemView('/'. $user.'/versions_trashbin')); } - $trashbinSize += self::copy_recursive($file_path, 'files_trashbin/'.$deleted.'.d'.$timestamp, $view); + $trashbinSize += self::copy_recursive($file_path, 'files_trashbin/files/'.$deleted.'.d'.$timestamp, $view); - if ( $view->file_exists('files_trashbin/'.$deleted.'.d'.$timestamp) ) { - $query = \OC_DB::prepare("INSERT INTO *PREFIX*files_trash (id,timestamp,location,type,mime,user)" - ." VALUES (?,?,?,?,?,?)"); + if ( $view->file_exists('files_trashbin/files/'.$deleted.'.d'.$timestamp) ) { + $query = \OC_DB::prepare("INSERT INTO *PREFIX*files_trash (id,timestamp,location,type,mime,user) VALUES (?,?,?,?,?,?)"); $result = $query->execute(array($deleted, $timestamp, $location, $type, $mime, $user)); if ( !$result ) { // if file couldn't be added to the database than also don't store it in the trash bin. - $view->deleteAll('files_trashbin/'.$deleted.'.d'.$timestamp); + $view->deleteAll('files_trashbin/files/'.$deleted.'.d'.$timestamp); \OC_Log::write('files_trashbin', 'trash bin database couldn\'t be updated', \OC_log::ERROR); return; } - + + // Take care of file versions if ( \OCP\App::isEnabled('files_versions') ) { if ( $view->is_dir('files_versions'.$file_path) ) { - $trashbinSize += self::calculateSize( - new \OC_FilesystemView('/'. $user.'/files_versions/'.$file_path) - ); - $view->rename('files_versions'.$file_path, 'versions_trashbin/'. $deleted.'.d'.$timestamp); - } else if ( $versions = \OCA\Files_Versions\Storage::getVersions($file_path) ) { + $trashbinSize += self::calculateSize(new \OC_FilesystemView('/'. $user.'/files_versions/'.$file_path)); + $view->rename('files_versions'.$file_path, 'files_trashbin/versions'. $deleted.'.d'.$timestamp); + } else if ( $versions = \OCA\Files_Versions\Storage::getVersions($user, $file_path) ) { foreach ($versions as $v) { $trashbinSize += $view->filesize('files_versions'.$v['path'].'.v'.$v['version']); - $view->rename('files_versions'.$v['path'].'.v'.$v['version'], - 'versions_trashbin/'. $deleted.'.v'.$v['version'].'.d'.$timestamp); + $view->rename('files_versions'.$v['path'].'.v'.$v['version'], 'files_trashbin/versions'. $deleted.'.v'.$v['version'].'.d'.$timestamp); } } } + + // Take care of encryption keys + $keyfile = \OC_Filesystem::normalizePath('files_encryption/keyfiles/'.$file_path); + if ( \OCP\App::isEnabled('files_encryption') && $view->file_exists($keyfile.'.key') ) { + if ( $view->is_dir('files'.$file_path) ) { + $trashbinSize += self::calculateSize(new \OC_FilesystemView('/'.$user.'/'.$keyfile)); + $view->rename($keyfile, 'files_trashbin/keyfiles/'. $deleted.'.d'.$timestamp); + } else { + $trashbinSize += $view->filesize($keyfile.'.key'); + $view->rename($keyfile.'.key', 'files_trashbin/keyfiles/'. $deleted.'.key.d'.$timestamp); + } + } } else { \OC_Log::write('files_trashbin', 'Couldn\'t move '.$file_path.' to the trash bin', \OC_log::ERROR); } - + // get available disk space for user - $quota = \OCP\Util::computerFileSize(\OC_Preferences::getValue($user, 'files', 'quota')); - if ( $quota == null ) { - $quota = \OCP\Util::computerFileSize(\OC_Appconfig::getValue('files', 'default_quota')); + $quota = \OC_Preferences::getValue($user, 'files', 'quota'); + if ( $quota === null ) { + $quota = \OC_Appconfig::getValue('files', 'default_quota'); } - if ( $quota == null ) { - $quota = \OC\Files\Filesystem::free_space('/'); + if ( $quota === null ) { + $quota = \OC\Files\Filesystem::free_space('/') / count(\OCP\User::getUsers()); + } else { + $quota = \OCP\Util::computerFileSize($quota); } - + // calculate available space for trash bin $rootInfo = $view->getFileInfo('/files'); $free = $quota-$rootInfo['size']; // remaining free space for user @@ -106,9 +119,10 @@ class Trashbin { } else { $availableSpace = $free-$trashbinSize; } - $trashbinSize -= self::expire($availableSpace); - \OCP\Config::setAppValue('files_trashbin', 'size', $trashbinSize); + + self::setTrashbinSize($user, $trashbinSize); + } @@ -121,10 +135,10 @@ class Trashbin { public static function restore($file, $filename, $timestamp) { $user = \OCP\User::getUser(); $view = new \OC_FilesystemView('/'.$user); - - if ( ($trashbinSize = \OCP\Config::getAppValue('files_trashbin', 'size')) === null ) { + + $trashbinSize = self::getTrashbinSize($user); + if ( $trashbinSize === false || $trashbinSize < 0 ) { $trashbinSize = self::calculateSize(new \OC_FilesystemView('/'. $user.'/files_trashbin')); - $trashbinSize += self::calculateSize(new \OC_FilesystemView('/'. $user.'/versions_trashbin')); } if ( $timestamp ) { $query = \OC_DB::prepare('SELECT location,type FROM *PREFIX*files_trash' @@ -143,15 +157,15 @@ class Trashbin { $location = ''; } } else { - $path_parts = pathinfo($filename); + $path_parts = pathinfo($file); $result[] = array( 'location' => $path_parts['dirname'], - 'type' => $view->is_dir('/files_trashbin/'.$file) ? 'dir' : 'files', + 'type' => $view->is_dir('/files_trashbin/files/'.$file) ? 'dir' : 'files', ); $location = ''; } - - $source = \OC_Filesystem::normalizePath('files_trashbin/'.$file); + + $source = \OC_Filesystem::normalizePath('files_trashbin/files/'.$file); $target = \OC_Filesystem::normalizePath('files/'.$location.'/'.$filename); // we need a extension in case a file/dir with the same name already exists @@ -171,33 +185,49 @@ class Trashbin { } else { $versionedFile = $file; } - if ( $result[0]['type'] == 'dir' ) { - $trashbinSize -= self::calculateSize( - new \OC_FilesystemView('/'.$user.'/'.'versions_trashbin/'. $file) - ); - $view->rename(\OC_Filesystem::normalizePath('versions_trashbin/'. $file), - \OC_Filesystem::normalizePath('files_versions/'.$location.'/'.$filename.$ext)); + if ( $result[0]['type'] === 'dir' ) { + $trashbinSize -= self::calculateSize(new \OC_FilesystemView('/'.$user.'/'.'files_trashbin/versions/'. $file)); + $view->rename(\OC_Filesystem::normalizePath('files_trashbin/versions/'. $file), \OC_Filesystem::normalizePath('files_versions/'.$location.'/'.$filename.$ext)); } else if ( $versions = self::getVersionsFromTrash($versionedFile, $timestamp) ) { foreach ($versions as $v) { if ($timestamp ) { - $trashbinSize -= $view->filesize('versions_trashbin/'.$versionedFile.'.v'.$v.'.d'.$timestamp); - $view->rename('versions_trashbin/'.$versionedFile.'.v'.$v.'.d'.$timestamp, - 'files_versions/'.$location.'/'.$filename.$ext.'.v'.$v); + $trashbinSize -= $view->filesize('files_trashbin/versions/'.$versionedFile.'.v'.$v.'.d'.$timestamp); + $view->rename('files_trashbin/versions/'.$versionedFile.'.v'.$v.'.d'.$timestamp, 'files_versions/'.$location.'/'.$filename.$ext.'.v'.$v); } else { - $trashbinSize -= $view->filesize('versions_trashbin/'.$versionedFile.'.v'.$v); - $view->rename('versions_trashbin/'.$versionedFile.'.v'.$v, - 'files_versions/'.$location.'/'.$filename.$ext.'.v'.$v); + $trashbinSize -= $view->filesize('files_trashbin/versions/'.$versionedFile.'.v'.$v); + $view->rename('files_trashbin/versions/'.$versionedFile.'.v'.$v, 'files_versions/'.$location.'/'.$filename.$ext.'.v'.$v); } } } } - + + // Take care of encryption keys TODO! Get '.key' in file between file name and delete date (also for permanent delete!) + $parts = pathinfo($file); + if ( $result[0]['type'] === 'dir' ) { + $keyfile = \OC_Filesystem::normalizePath('files_trashbin/keyfiles/'.$parts['dirname'].'/'.$filename); + } else { + $keyfile = \OC_Filesystem::normalizePath('files_trashbin/keyfiles/'.$parts['dirname'].'/'.$filename.'.key'); + } + if ($timestamp) { + $keyfile .= '.d'.$timestamp; + } + if ( \OCP\App::isEnabled('files_encryption') && $view->file_exists($keyfile) ) { + if ( $result[0]['type'] === 'dir' ) { + $trashbinSize -= self::calculateSize(new \OC_FilesystemView('/'.$user.'/'.$keyfile)); + $view->rename($keyfile, 'files_encryption/keyfiles/'. $location.'/'.$filename); + } else { + $trashbinSize -= $view->filesize($keyfile); + $view->rename($keyfile, 'files_encryption/keyfiles/'. $location.'/'.$filename.'.key'); + } + } + if ( $timestamp ) { $query = \OC_DB::prepare('DELETE FROM *PREFIX*files_trash WHERE user=? AND id=? AND timestamp=?'); $query->execute(array($user,$filename,$timestamp)); } - \OCP\Config::setAppValue('files_trashbin', 'size', $trashbinSize); + self::setTrashbinSize($user, $trashbinSize); + return true; } else { \OC_Log::write('files_trashbin', 'Couldn\'t restore file from trash bin, '.$filename, \OC_log::ERROR); @@ -216,10 +246,10 @@ class Trashbin { $user = \OCP\User::getUser(); $view = new \OC_FilesystemView('/'.$user); $size = 0; - - if ( ($trashbinSize = \OCP\Config::getAppValue('files_trashbin', 'size')) === null ) { + + $trashbinSize = self::getTrashbinSize($user); + if ( $trashbinSize === false || $trashbinSize < 0 ) { $trashbinSize = self::calculateSize(new \OC_FilesystemView('/'. $user.'/files_trashbin')); - $trashbinSize += self::calculateSize(new \OC_FilesystemView('/'. $user.'/versions_trashbin')); } if ( $timestamp ) { @@ -231,31 +261,50 @@ class Trashbin { } if ( \OCP\App::isEnabled('files_versions') ) { - if ($view->is_dir('versions_trashbin/'.$file)) { - $size += self::calculateSize(new \OC_Filesystemview('/'.$user.'/versions_trashbin/'.$file)); - $view->unlink('versions_trashbin/'.$file); + if ($view->is_dir('files_trashbin/versions/'.$file)) { + $size += self::calculateSize(new \OC_Filesystemview('/'.$user.'/files_trashbin/versions/'.$file)); + $view->unlink('files_trashbin/versions/'.$file); } else if ( $versions = self::getVersionsFromTrash($filename, $timestamp) ) { foreach ($versions as $v) { if ($timestamp ) { - $size += $view->filesize('/versions_trashbin/'.$filename.'.v'.$v.'.d'.$timestamp); - $view->unlink('/versions_trashbin/'.$filename.'.v'.$v.'.d'.$timestamp); + $size += $view->filesize('/files_trashbin/versions/'.$filename.'.v'.$v.'.d'.$timestamp); + $view->unlink('/files_trashbin/versions/'.$filename.'.v'.$v.'.d'.$timestamp); } else { - $size += $view->filesize('/versions_trashbin/'.$filename.'.v'.$v); - $view->unlink('/versions_trashbin/'.$filename.'.v'.$v); + $size += $view->filesize('/files_trashbin/versions/'.$filename.'.v'.$v); + $view->unlink('/files_trashbin/versions/'.$filename.'.v'.$v); } } } } - - if ($view->is_dir('/files_trashbin/'.$file)) { - $size += self::calculateSize(new \OC_Filesystemview('/'.$user.'/files_trashbin/'.$file)); + + // Take care of encryption keys + $parts = pathinfo($file); + if ( $view->is_dir('/files_trashbin/files/'.$file) ) { + $keyfile = \OC_Filesystem::normalizePath('files_trashbin/keyfiles/'.$filename); } else { - $size += $view->filesize('/files_trashbin/'.$file); + $keyfile = \OC_Filesystem::normalizePath('files_trashbin/keyfiles/'.$filename.'.key'); } - $view->unlink('/files_trashbin/'.$file); + if ($timestamp) { + $keyfile .= '.d'.$timestamp; + } + if ( \OCP\App::isEnabled('files_encryption') && $view->file_exists($keyfile) ) { + if ( $view->is_dir($keyfile) ) { + $size += self::calculateSize(new \OC_FilesystemView('/'.$user.'/'.$keyfile)); + } else { + $size += $view->filesize($keyfile); + } + $view->unlink($keyfile); + } + + if ($view->is_dir('/files_trashbin/files/'.$file)) { + $size += self::calculateSize(new \OC_Filesystemview('/'.$user.'/files_trashbin/files/'.$file)); + } else { + $size += $view->filesize('/files_trashbin/files/'.$file); + } + $view->unlink('/files_trashbin/files/'.$file); $trashbinSize -= $size; - \OCP\Config::setAppValue('files_trashbin', 'size', $trashbinSize); - + self::setTrashbinSize($user, $trashbinSize); + return $size; } @@ -275,7 +324,7 @@ class Trashbin { $filename = $filename; } - $target = \OC_Filesystem::normalizePath('files_trashbin/'.$filename); + $target = \OC_Filesystem::normalizePath('files_trashbin/files/'.$filename); return $view->file_exists($target); } @@ -301,31 +350,9 @@ class Trashbin { $timestamp = $r['timestamp']; $filename = $r['id']; if ( $r['timestamp'] < $limit ) { - if ($view->is_dir('files_trashbin/'.$filename.'.d'.$timestamp)) { - $size += self::calculateSize( - new \OC_FilesystemView('/'.$user.'/files_trashbin/'.$filename.'.d'.$timestamp) - ); - } else { - $size += $view->filesize('files_trashbin/'.$filename.'.d'.$timestamp); - } - $view->unlink('files_trashbin/'.$filename.'.d'.$timestamp); - if ($r['type'] == 'dir') { - $size += self::calculateSize( - new \OC_FilesystemView('/'.$user.'/versions_trashbin/'.$filename.'.d'.$timestamp) - ); - $view->unlink('versions_trashbin/'.$filename.'.d'.$timestamp); - } else if ( $versions = self::getVersionsFromTrash($filename, $timestamp) ) { - foreach ($versions as $v) { - $size += $view->filesize('versions_trashbin/'.$filename.'.v'.$v.'.d'.$timestamp); - $view->unlink('versions_trashbin/'.$filename.'.v'.$v.'.d'.$timestamp); - } - } + $size += self::delete($filename, $timestamp); } } - - $query = \OC_DB::prepare('DELETE FROM *PREFIX*files_trash WHERE user=? AND timestampexecute(array($user,$limit)); - $availableSpace = $availableSpace + $size; // if size limit for trash bin reached, delete oldest files in trash bin if ($availableSpace < 0) { @@ -341,6 +368,7 @@ class Trashbin { $i++; } + } return $size; @@ -382,7 +410,7 @@ class Trashbin { * @param $timestamp timestamp when the file was deleted */ private static function getVersionsFromTrash($filename, $timestamp) { - $view = new \OC_FilesystemView('/'.\OCP\User::getUser().'/versions_trashbin'); + $view = new \OC_FilesystemView('/'.\OCP\User::getUser().'/files_trashbin/versions'); $versionsName = \OCP\Config::getSystemValue('datadirectory').$view->getAbsolutePath($filename); $versions = array(); if ($timestamp ) { @@ -449,4 +477,35 @@ class Trashbin { return $size; } + /** + * get current size of trash bin from a given user + * + * @param $user user who owns the trash bin + * @return mixed trash bin size or false if no trash bin size is stored + */ + private static function getTrashbinSize($user) { + $query = \OC_DB::prepare('SELECT size FROM *PREFIX*files_trashsize WHERE user=?'); + $result = $query->execute(array($user))->fetchAll(); + + if ($result) { + return $result[0]['size']; + } + return false; + } + + /** + * write to the database how much space is in use for the trash bin + * + * @param $user owner of the trash bin + * @param $size size of the trash bin + */ + private static function setTrashbinSize($user, $size) { + if ( self::getTrashbinSize($user) === false) { + $query = \OC_DB::prepare('INSERT INTO *PREFIX*files_trashsize (size, user) VALUES (?, ?)'); + }else { + $query = \OC_DB::prepare('UPDATE *PREFIX*files_trashsize SET size=? WHERE user=?'); + } + $query->execute(array($size, $user)); + } + } diff --git a/apps/files_trashbin/templates/index.php b/apps/files_trashbin/templates/index.php index c948c94d55..aaeeb5c6f6 100644 --- a/apps/files_trashbin/templates/index.php +++ b/apps/files_trashbin/templates/index.php @@ -5,7 +5,7 @@
- +
t('Nothing in here. Your trash bin is empty!')?>
diff --git a/apps/files_versions/ajax/getVersions.php b/apps/files_versions/ajax/getVersions.php index 53fc04625c..8a8fa43080 100644 --- a/apps/files_versions/ajax/getVersions.php +++ b/apps/files_versions/ajax/getVersions.php @@ -1,11 +1,11 @@ + + + *dbname* + true + false + + utf8 + + + + *dbprefix*files_versions + + + + + user + text + + true + 64 + + + size + text + + true + 50 + + + + +
+ +
diff --git a/apps/files_versions/appinfo/info.xml b/apps/files_versions/appinfo/info.xml index 0155f8e830..44878da5e4 100644 --- a/apps/files_versions/appinfo/info.xml +++ b/apps/files_versions/appinfo/info.xml @@ -4,7 +4,7 @@ Versions AGPL Frank Karlitschek - 4.91 + 4.93 true Versioning of files diff --git a/apps/files_versions/appinfo/version b/apps/files_versions/appinfo/version index e6d5cb833c..e4c0d46e55 100644 --- a/apps/files_versions/appinfo/version +++ b/apps/files_versions/appinfo/version @@ -1 +1 @@ -1.0.2 \ No newline at end of file +1.0.3 \ No newline at end of file diff --git a/apps/files_versions/lib/versions.php b/apps/files_versions/lib/versions.php index adbf2c1df7..778fefd8a7 100644 --- a/apps/files_versions/lib/versions.php +++ b/apps/files_versions/lib/versions.php @@ -35,7 +35,7 @@ class Storage { 6 => array('intervalEndsAfter' => -1, 'step' => 604800), ); - private static function getUidAndFilename($filename) { + public static function getUidAndFilename($filename) { $uid = \OC\Files\Filesystem::getOwner($filename); \OC\Files\Filesystem::initMountPoints($uid); if ( $uid != \OCP\User::getUser() ) { @@ -46,6 +46,37 @@ class Storage { return array($uid, $filename); } + /** + * get current size of all versions from a given user + * + * @param $user user who owns the versions + * @return mixed versions size or false if no versions size is stored + */ + private static function getVersionsSize($user) { + $query = \OC_DB::prepare('SELECT size FROM *PREFIX*files_versions WHERE user=?'); + $result = $query->execute(array($user))->fetchAll(); + + if ($result) { + return $result[0]['size']; + } + return false; + } + + /** + * write to the database how much space is in use for versions + * + * @param $user owner of the versions + * @param $size size of the versions + */ + private static function setVersionsSize($user, $size) { + if ( self::getVersionsSize($user) === false) { + $query = \OC_DB::prepare('INSERT INTO *PREFIX*files_versions (size, user) VALUES (?, ?)'); + }else { + $query = \OC_DB::prepare('UPDATE *PREFIX*files_versions SET size=? WHERE user=?'); + } + $query->execute(array($size, $user)); + } + /** * store a new version of a file. */ @@ -74,17 +105,19 @@ class Storage { } // store a new version of a file - $result = $users_view->copy('files'.$filename, 'files_versions'.$filename.'.v'.$users_view->filemtime('files'.$filename)); - if ( ($versionsSize = \OCP\Config::getAppValue('files_versions', 'size')) === null ) { + $users_view->copy('files'.$filename, 'files_versions'.$filename.'.v'.$users_view->filemtime('files'.$filename)); + $versionsSize = self::getVersionsSize($uid); + if ( $versionsSize === false || $versionSize < 0 ) { $versionsSize = self::calculateSize($uid); } + $versionsSize += $users_view->filesize('files'.$filename); // expire old revisions if necessary $newSize = self::expire($filename, $versionsSize); if ( $newSize != $versionsSize ) { - \OCP\Config::setAppValue('files_versions', 'size', $versionsSize); + self::setVersionsSize($uid, $newSize); } } } @@ -99,14 +132,15 @@ class Storage { $abs_path = \OCP\Config::getSystemValue('datadirectory').$versions_fileview->getAbsolutePath('').$filename.'.v'; if( ($versions = self::getVersions($uid, $filename)) ) { - if ( ($versionsSize = \OCP\Config::getAppValue('files_versions', 'size')) === null ) { + $versionsSize = self::getVersionsSize($uid); + if ( $versionsSize === false || $versionsSize < 0 ) { $versionsSize = self::calculateSize($uid); } foreach ($versions as $v) { unlink($abs_path . $v['version']); $versionsSize -= $v['size']; } - \OCP\Config::setAppValue('files_versions', 'size', $versionsSize); + self::setVersionsSize($uid, $versionsSize); } } @@ -316,17 +350,20 @@ class Storage { $versions_fileview = new \OC\Files\View('/'.$uid.'/files_versions'); // get available disk space for user - $quota = \OCP\Util::computerFileSize(\OC_Preferences::getValue($uid, 'files', 'quota')); - if ( $quota == null ) { - $quota = \OCP\Util::computerFileSize(\OC_Appconfig::getValue('files', 'default_quota')); + $quota = \OC_Preferences::getValue($uid, 'files', 'quota'); + if ( $quota === null ) { + $quota = \OC_Appconfig::getValue('files', 'default_quota'); } - if ( $quota == null ) { - $quota = \OC\Files\Filesystem::free_space('/'); + if ( $quota === null ) { + $quota = \OC\Files\Filesystem::free_space('/') / count(\OCP\User::getUsers()); + } else { + $quota = \OCP\Util::computerFileSize($quota); } // make sure that we have the current size of the version history if ( $versionsSize === null ) { - if ( ($versionsSize = \OCP\Config::getAppValue('files_versions', 'size')) === null ) { + $versionsSize = self::getVersionsSize($uid); + if ( $versionsSize === false || $versionsSize < 0 ) { $versionsSize = self::calculateSize($uid); } } diff --git a/apps/user_ldap/appinfo/info.xml b/apps/user_ldap/appinfo/info.xml index 53269edfb3..03a4fa5233 100644 --- a/apps/user_ldap/appinfo/info.xml +++ b/apps/user_ldap/appinfo/info.xml @@ -7,7 +7,7 @@ This app is not compatible to the WebDAV user backend. AGPL Dominik Schmidt and Arthur Schiwon - 4.91 + 4.93 true diff --git a/apps/user_ldap/l10n/he.php b/apps/user_ldap/l10n/he.php index 5c563b7b6f..c9b0e282f1 100644 --- a/apps/user_ldap/l10n/he.php +++ b/apps/user_ldap/l10n/he.php @@ -7,6 +7,7 @@ "User Login Filter" => "סנן כניסת משתמש", "User List Filter" => "סנן רשימת משתמשים", "Group Filter" => "סנן קבוצה", +"Port" => "פורט", "in seconds. A change empties the cache." => "בשניות. שינוי מרוקן את המטמון.", "in bytes" => "בבתים", "Help" => "עזרה" diff --git a/apps/user_ldap/l10n/my_MM.php b/apps/user_ldap/l10n/my_MM.php index d7bd0adc49..ee8d3dd26f 100644 --- a/apps/user_ldap/l10n/my_MM.php +++ b/apps/user_ldap/l10n/my_MM.php @@ -1,3 +1,4 @@ "စကားဝှက်", "Help" => "အကူအညီ" ); diff --git a/apps/user_ldap/lib/connection.php b/apps/user_ldap/lib/connection.php index abbc133038..6643428afe 100644 --- a/apps/user_ldap/lib/connection.php +++ b/apps/user_ldap/lib/connection.php @@ -357,9 +357,6 @@ class Connection { case 'ldapAgentPassword': $value = base64_encode($value); break; - case 'homeFolderNamingRule': - $value = empty($value) ? 'opt:username' : $value; - break; case 'ldapBase': case 'ldapBaseUsers': case 'ldapBaseGroups': @@ -394,10 +391,10 @@ class Connection { $config = array(); foreach($trans as $dbKey => $classKey) { if($classKey == 'homeFolderNamingRule') { - if(strpos($this->config[$classKey], 'opt') === 0) { - $config[$dbKey] = ''; - } else { + if(strpos($this->config[$classKey], 'attr:') === 0) { $config[$dbKey] = substr($this->config[$classKey], 5); + } else { + $config[$dbKey] = ''; } continue; } else if((strpos($classKey, 'ldapBase') !== false) @@ -540,7 +537,7 @@ class Connection { 'ldap_cache_ttl' => 600, 'ldap_uuid_attribute' => 'auto', 'ldap_override_uuid_attribute' => 0, - 'home_folder_naming_rule' => 'opt:username', + 'home_folder_naming_rule' => '', 'ldap_turn_off_cert_check' => 0, 'ldap_configuration_active' => 1, 'ldap_attributes_for_user_search' => '', diff --git a/apps/user_webdavauth/appinfo/info.xml b/apps/user_webdavauth/appinfo/info.xml index f62f03577e..76b314e48a 100755 --- a/apps/user_webdavauth/appinfo/info.xml +++ b/apps/user_webdavauth/appinfo/info.xml @@ -7,7 +7,7 @@ This app is not compatible to the LDAP user and group backend. AGPL Frank Karlitschek - 4.91 + 4.93 true diff --git a/autotest.cmd b/autotest.cmd index 053860db54..a511faef9c 100644 --- a/autotest.cmd +++ b/autotest.cmd @@ -4,14 +4,14 @@ :: @author Thomas Müller :: @author Tobias Ramforth (translated into Windows batch file) :: -:: @copyright 2012 Thomas Müller thomas.mueller@tmit.eu +:: @copyright 2012, 2013 Thomas Müller thomas.mueller@tmit.eu :: @echo off set DATADIR=data-autotest set BASEDIR=%~dp0 -:: create autoconfig for sqlite, mysql and postgresql +:: create autoconfig for sqlite, mysql, postgresql and mssql echo ^ .\tests\autoconfig-sqlite.php echo $AUTOCONFIG ^= array ^( >> .\tests\autoconfig-sqlite.php echo 'installed' ^=^> false^, >> .\tests\autoconfig-sqlite.php @@ -50,16 +50,35 @@ echo 'dbhost' ^=^> 'localhost'^, >> .\tests\autoconfig-pgsql.php echo 'dbpass' ^=^> 'owncloud'^, >> .\tests\autoconfig-pgsql.php echo ^)^; >> .\tests\autoconfig-pgsql.php +echo ^ .\tests\autoconfig-mssql.php +echo $AUTOCONFIG ^= array ^( >> .\tests\autoconfig-mssql.php +echo 'installed' ^=^> false^, >> .\tests\autoconfig-mssql.php +echo 'dbtype' ^=^> 'mssql'^, >> .\tests\autoconfig-mssql.php +echo 'dbtableprefix' ^=^> 'oc_'^, >> .\tests\autoconfig-mssql.php +echo 'adminlogin' ^=^> 'admin'^, >> .\tests\autoconfig-mssql.php +echo 'adminpass' ^=^> 'admin'^, >> .\tests\autoconfig-mssql.php +echo 'directory' ^=^> '%BASEDIR%%DATADIR%'^, >> .\tests\autoconfig-mssql.php +echo 'dbuser' ^=^> 'oc_autotest'^, >> .\tests\autoconfig-mssql.php +echo 'dbname' ^=^> 'oc_autotest'^, >> .\tests\autoconfig-mssql.php +echo 'dbhost' ^=^> 'localhost\sqlexpress'^, >> .\tests\autoconfig-mssql.php +echo 'dbpass' ^=^> 'owncloud'^, >> .\tests\autoconfig-mssql.php +echo ^)^; >> .\tests\autoconfig-mssql.php + echo localhost:5432:*:oc_autotest:owncloud > %APPDATA%\postgresql\pgpass.conf :: :: start test execution :: -::call:execute_tests "sqlite" -call:execute_tests "mysql" -::call:execute_tests "mssql" -::call:execute_tests "ora" -::call:execute_tests "pgsql" +if [%1] == [] ( + echo "Running on all database backends" + call:execute_tests "sqlite" + call:execute_tests "mysql" + call:execute_tests "mssql" + ::call:execute_tests "ora" + call:execute_tests "pgsql" +) else ( + call:execute_tests "%1" +) goto:eof @@ -83,6 +102,9 @@ goto:eof if "%~1" == "mysql" mysql -u oc_autotest -powncloud -e "DROP DATABASE oc_autotest" if "%~1" == "pgsql" dropdb -h localhost -p 5432 -U oc_autotest -w oc_autotest + + :: we assume a sqlexpress installation + if "%~1" == "mssql" sqlcmd -S localhost\sqlexpress -U oc_autotest -P owncloud -Q "IF EXISTS (SELECT name FROM sys.databases WHERE name=N'oc_autotest') DROP DATABASE [oc_autotest]" :: copy autoconfig copy /y %BASEDIR%\tests\autoconfig-%~1.php %BASEDIR%\config\autoconfig.php @@ -96,9 +118,8 @@ goto:eof rmdir /s /q coverage-html-%~1 md coverage-html-%~1 php -f enable_all.php - ::phpunit --log-junit autotest-results-%~1.xml --coverage-clover autotest-clover-%~1.xml --coverage-html coverage-html-%~1 - ::phpunit --bootstrap bootstrap.php --configuration phpunit.xml - php win32-phpunit.php --bootstrap bootstrap.php --configuration phpunit.xml --log-junit autotest-results-%~1.xml --coverage-clover autotest-clover-%~1.xml --coverage-html coverage-html-%~1 + + php win32-phpunit.php --bootstrap bootstrap.php --configuration phpunit-autotest.xml --log-junit autotest-results-%~1.xml --coverage-clover autotest-clover-%~1.xml --coverage-html coverage-html-%~1 echo "Done with testing %~1 ..." cd %BASEDIR% goto:eof @@ -114,4 +135,10 @@ goto:eof :: - to enable dropdb I decided to add following line to pg_hba.conf (this is not the safest way but I don't care for the testing machine): :: local all all trust :: +:: NOTES on mssql: +:: we assume the usage of a local installed sqlexpress +:: create a user 'oc_autotest' with password 'owncloud' and assign the server role 'dbcreator' +:: make sure the sqlserver is configured to allow sql authentication +:: + diff --git a/core/js/js.js b/core/js/js.js index 6d5d65403f..e373fca886 100644 --- a/core/js/js.js +++ b/core/js/js.js @@ -669,7 +669,7 @@ $(document).ready(function(){ $('#settings #expanddiv').click(function(event){ event.stopPropagation(); }); - $(window).click(function(){//hide the settings menu when clicking outside it + $(document).click(function(){//hide the settings menu when clicking outside it $('#settings #expanddiv').slideUp(200); }); diff --git a/core/js/setup.js b/core/js/setup.js index 2656cac2f4..76812b2997 100644 --- a/core/js/setup.js +++ b/core/js/setup.js @@ -5,6 +5,7 @@ $(document).ready(function() { mysql:!!$('#hasMySQL').val(), postgresql:!!$('#hasPostgreSQL').val(), oracle:!!$('#hasOracle').val(), + mssql:!!$('#hasMSSQL').val() }; $('#selectDbType').buttonset(); @@ -41,6 +42,12 @@ $(document).ready(function() { $('#dbhost').show(250); $('#dbhostlabel').show(250); }); + + $('#mssql').click(function() { + $('#use_other_db').slideDown(250); + $('#dbhost').show(250); + $('#dbhostlabel').show(250); + }); $('input[checked]').trigger('click'); diff --git a/core/l10n/he.php b/core/l10n/he.php index 75c378cece..1db5820bdf 100644 --- a/core/l10n/he.php +++ b/core/l10n/he.php @@ -5,6 +5,7 @@ "User %s shared the folder \"%s\" with you. It is available for download here: %s" => "המשתמש %s שיתף אתך את התיקייה „%s“. ניתן להוריד את התיקייה מכאן: %s", "Category type not provided." => "סוג הקטגוריה לא סופק.", "No category to add?" => "אין קטגוריה להוספה?", +"This category already exists: %s" => "הקטגוריה הבאה כבר קיימת: %s", "Object type not provided." => "סוג הפריט לא סופק.", "%s ID not provided." => "מזהה %s לא סופק.", "Error adding %s to favorites." => "אירעה שגיאה בעת הוספת %s למועדפים.", @@ -52,6 +53,7 @@ "Error" => "שגיאה", "The app name is not specified." => "שם היישום לא צוין.", "The required file {file} is not installed!" => "הקובץ הנדרש {file} אינו מותקן!", +"Shared" => "שותף", "Share" => "שתף", "Error while sharing" => "שגיאה במהלך השיתוף", "Error while unsharing" => "שגיאה במהלך ביטול השיתוף", @@ -82,6 +84,8 @@ "Error setting expiration date" => "אירעה שגיאה בעת הגדרת תאריך התפוגה", "Sending ..." => "מתבצעת שליחה ...", "Email sent" => "הודעת הדוא״ל נשלחה", +"The update was unsuccessful. Please report this issue to the ownCloud community." => "תהליך העדכון לא הושלם בהצלחה. נא דווח את הבעיה בקהילת ownCloud.", +"The update was successful. Redirecting you to ownCloud now." => "תהליך העדכון הסתיים בהצלחה. עכשיו מנתב אותך אל ownCloud.", "ownCloud password reset" => "איפוס הססמה של ownCloud", "Use the following link to reset your password: {link}" => "יש להשתמש בקישור הבא כדי לאפס את הססמה שלך: {link}", "You will receive a link to reset your password via Email." => "יישלח לתיבת הדוא״ל שלך קישור לאיפוס הססמה.", @@ -105,6 +109,8 @@ "Security Warning" => "אזהרת אבטחה", "No secure random number generator is available, please enable the PHP OpenSSL extension." => "אין מחולל מספרים אקראיים מאובטח, נא להפעיל את ההרחבה OpenSSL ב־PHP.", "Without a secure random number generator an attacker may be able to predict password reset tokens and take over your account." => "ללא מחולל מספרים אקראיים מאובטח תוקף יכול לנבא את מחרוזות איפוס הססמה ולהשתלט על החשבון שלך.", +"Your data directory and files are probably accessible from the internet because the .htaccess file does not work." => "תיקיית וקבצי המידע שלך כנראה נגישים מהאינטרנט מכיוון שקובץ ה.htaccess לא עובד.", +"For information how to properly configure your server, please see the documentation." => "לקבלת מידע להגדרה נכונה של השרת שלך, ראה את התיעוד.", "Create an admin account" => "יצירת חשבון מנהל", "Advanced" => "מתקדם", "Data folder" => "תיקיית נתונים", @@ -124,6 +130,7 @@ "Lost your password?" => "שכחת את ססמתך?", "remember" => "שמירת הססמה", "Log in" => "כניסה", +"Alternative Logins" => "כניסות אלטרנטיביות", "prev" => "הקודם", "next" => "הבא", "Updating ownCloud to version %s, this may take a while." => "מעדכן את ownCloud אל גרסא %s, זה עלול לקחת זמן מה." diff --git a/core/l10n/my_MM.php b/core/l10n/my_MM.php index f8d2458081..97631d4df5 100644 --- a/core/l10n/my_MM.php +++ b/core/l10n/my_MM.php @@ -1,4 +1,18 @@ "ထည့်ရန်ခေါင်းစဉ်မရှိဘူးလား", +"No categories selected for deletion." => "ဖျက်ရန်အတွက်ခေါင်းစဉ်မရွေးထားပါ", +"January" => "ဇန်နဝါရီ", +"February" => "ဖေဖော်ဝါရီ", +"March" => "မတ်", +"April" => "ဧပြီ", +"May" => "မေ", +"June" => "ဇွန်", +"July" => "ဇူလိုင်", +"August" => "ဩဂုတ်", +"September" => "စက်တင်ဘာ", +"October" => "အောက်တိုဘာ", +"November" => "နိုဝင်ဘာ", +"December" => "ဒီဇင်ဘာ", "seconds ago" => "စက္ကန့်အနည်းငယ်က", "1 minute ago" => "၁ မိနစ်အရင်က", "1 hour ago" => "၁ နာရီ အရင်က", @@ -7,7 +21,44 @@ "last month" => "ပြီးခဲ့သောလ", "last year" => "မနှစ်က", "years ago" => "နှစ် အရင်က", +"Choose" => "ရွေးချယ်", +"Cancel" => "ပယ်ဖျက်မည်", +"No" => "မဟုတ်ဘူး", +"Yes" => "ဟုတ်", +"Ok" => "အိုကေ", +"Password" => "စကားဝှက်", +"Set expiration date" => "သက်တမ်းကုန်ဆုံးမည့်ရက်သတ်မှတ်မည်", +"Expiration date" => "သက်တမ်းကုန်ဆုံးမည့်ရက်", +"Share via email:" => "အီးမေးလ်ဖြင့်ဝေမျှမည် -", +"Resharing is not allowed" => "ပြန်လည်ဝေမျှခြင်းခွင့်မပြုပါ", +"can edit" => "ပြင်ဆင်နိုင်", +"create" => "ဖန်တီးမည်", +"delete" => "ဖျက်မည်", +"share" => "ဝေမျှမည်", +"Password protected" => "စကားဝှက်ဖြင့်ကာကွယ်ထားသည်", +"You will receive a link to reset your password via Email." => "အီးမေးလ်မှတစ်ဆင့် သင်၏စကားဝှက်ကို ပြန်ဖော်ရန်အတွက် Link တစ်ခုလက်ခံရရှိပါလိမ့်မယ်။", +"Username" => "သုံးစွဲသူအမည်", +"Your password was reset" => "သင်၏စကားဝှက်ကိုပြန်ဖော်ပြီးပါပြီ။", +"To login page" => "ဝင်ရောက်သည့်စာမျက်နှာသို့", +"New password" => "စကားဝှက်အသစ်", "Users" => "သုံးစွဲသူ", "Apps" => "Apps", -"Help" => "အကူအညီ" +"Admin" => "အက်ဒမင်", +"Help" => "အကူအညီ", +"Cloud not found" => "မတွေ့ရှိမိပါ", +"Add" => "ပေါင်းထည့်", +"Security Warning" => "လုံခြုံရေးသတိပေးချက်", +"Create an admin account" => "အက်ဒမင်အကောင့်တစ်ခုဖန်တီးမည်", +"Advanced" => "အဆင့်မြင့်", +"Data folder" => "အချက်အလက်ဖိုလ်ဒါလ်", +"Database user" => "Database သုံးစွဲသူ", +"Database password" => "Database စကားဝှက်", +"Database name" => "Database အမည်", +"Finish setup" => "တပ်ဆင်ခြင်းပြီးပါပြီ။", +"web services under your control" => "သင်၏ထိန်းချုပ်မှု့အောက်တွင်ရှိသော Web services", +"Lost your password?" => "သင်၏စကားဝှက်ပျောက်သွားပြီလား။", +"remember" => "မှတ်မိစေသည်", +"Log in" => "ဝင်ရောက်ရန်", +"prev" => "ယခင်", +"next" => "နောက်သို့" ); diff --git a/core/setup.php b/core/setup.php index f16385466c..77eed5376d 100644 --- a/core/setup.php +++ b/core/setup.php @@ -16,6 +16,7 @@ $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'); // Protect data directory here, so we can test if the protection is working @@ -26,6 +27,7 @@ $opts = array( 'hasMySQL' => $hasMySQL, 'hasPostgreSQL' => $hasPostgreSQL, 'hasOracle' => $hasOracle, + 'hasMSSQL' => $hasMSSQL, 'directory' => $datadir, 'secureRNG' => OC_Util::secureRNG_available(), 'htaccessWorking' => OC_Util::ishtaccessworking(), diff --git a/core/templates/installation.php b/core/templates/installation.php index c48d2f764e..aca9648d0b 100644 --- a/core/templates/installation.php +++ b/core/templates/installation.php @@ -2,6 +2,7 @@ '> '> '> +'>
0): ?> @@ -60,7 +61,7 @@
- t( 'Configure the database' ); ?>
@@ -78,7 +79,7 @@ - +

MySQL t( 'will be used' ); ?>.

@@ -89,7 +90,7 @@ - +

PostgreSQL t( 'will be used' ); ?>.

@@ -100,7 +101,7 @@ - +

Oracle t( 'will be used' ); ?>.

@@ -109,6 +110,17 @@ /> + + + + +

MS SQL t( 'will be used' ); ?>.

+ + + + /> + +
diff --git a/core/templates/layout.user.php b/core/templates/layout.user.php index 03e55594d6..7a677b8834 100644 --- a/core/templates/layout.user.php +++ b/core/templates/layout.user.php @@ -34,7 +34,7 @@
    - +
    diff --git a/l10n/he/core.po b/l10n/he/core.po index 49cfe652f2..612d193348 100644 --- a/l10n/he/core.po +++ b/l10n/he/core.po @@ -12,9 +12,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2013-02-22 00:06+0100\n" -"PO-Revision-Date: 2013-02-20 23:20+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2013-02-25 00:05+0100\n" +"PO-Revision-Date: 2013-02-24 12:10+0000\n" +"Last-Translator: Gilad Naaman \n" "Language-Team: Hebrew (http://www.transifex.com/projects/p/owncloud/language/he/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -22,24 +22,24 @@ msgstr "" "Language: he\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ajax/share.php:85 +#: ajax/share.php:97 #, php-format msgid "User %s shared a file with you" msgstr "המשתמש %s שיתף אתך קובץ" -#: ajax/share.php:87 +#: ajax/share.php:99 #, php-format msgid "User %s shared a folder with you" msgstr "המשתמש %s שיתף אתך תיקייה" -#: ajax/share.php:89 +#: ajax/share.php:101 #, php-format msgid "" "User %s shared the file \"%s\" with you. It is available for download here: " "%s" msgstr "המשתמש %s שיתף אתך את הקובץ „%s“. ניתן להוריד את הקובץ מכאן: %s" -#: ajax/share.php:91 +#: ajax/share.php:104 #, php-format msgid "" "User %s shared the folder \"%s\" with you. It is available for download " @@ -57,7 +57,7 @@ msgstr "אין קטגוריה להוספה?" #: ajax/vcategories/add.php:37 #, php-format msgid "This category already exists: %s" -msgstr "" +msgstr "הקטגוריה הבאה כבר קיימת: %s" #: ajax/vcategories/addToFavorites.php:26 ajax/vcategories/delete.php:27 #: ajax/vcategories/favorites.php:24 @@ -85,79 +85,79 @@ msgstr "לא נבחרו קטגוריות למחיקה" msgid "Error removing %s from favorites." msgstr "שגיאה בהסרת %s מהמועדפים." -#: js/config.php:32 +#: js/config.php:34 msgid "Sunday" msgstr "יום ראשון" -#: js/config.php:32 +#: js/config.php:35 msgid "Monday" msgstr "יום שני" -#: js/config.php:32 +#: js/config.php:36 msgid "Tuesday" msgstr "יום שלישי" -#: js/config.php:32 +#: js/config.php:37 msgid "Wednesday" msgstr "יום רביעי" -#: js/config.php:32 +#: js/config.php:38 msgid "Thursday" msgstr "יום חמישי" -#: js/config.php:32 +#: js/config.php:39 msgid "Friday" msgstr "יום שישי" -#: js/config.php:32 +#: js/config.php:40 msgid "Saturday" msgstr "שבת" -#: js/config.php:33 +#: js/config.php:45 msgid "January" msgstr "ינואר" -#: js/config.php:33 +#: js/config.php:46 msgid "February" msgstr "פברואר" -#: js/config.php:33 +#: js/config.php:47 msgid "March" msgstr "מרץ" -#: js/config.php:33 +#: js/config.php:48 msgid "April" msgstr "אפריל" -#: js/config.php:33 +#: js/config.php:49 msgid "May" msgstr "מאי" -#: js/config.php:33 +#: js/config.php:50 msgid "June" msgstr "יוני" -#: js/config.php:33 +#: js/config.php:51 msgid "July" msgstr "יולי" -#: js/config.php:33 +#: js/config.php:52 msgid "August" msgstr "אוגוסט" -#: js/config.php:33 +#: js/config.php:53 msgid "September" msgstr "ספטמבר" -#: js/config.php:33 +#: js/config.php:54 msgid "October" msgstr "אוקטובר" -#: js/config.php:33 +#: js/config.php:55 msgid "November" msgstr "נובמבר" -#: js/config.php:33 +#: js/config.php:56 msgid "December" msgstr "דצמבר" @@ -258,7 +258,7 @@ msgstr "הקובץ הנדרש {file} אינו מותקן!" #: js/share.js:29 js/share.js:43 js/share.js:90 msgid "Shared" -msgstr "" +msgstr "שותף" #: js/share.js:93 msgid "Share" @@ -296,7 +296,7 @@ msgstr "שיתוף עם קישור" msgid "Password protect" msgstr "הגנה בססמה" -#: js/share.js:185 templates/installation.php:44 templates/login.php:35 +#: js/share.js:185 templates/installation.php:46 templates/login.php:35 msgid "Password" msgstr "ססמה" @@ -385,11 +385,11 @@ msgid "" "The update was unsuccessful. Please report this issue to the ownCloud " "community." -msgstr "" +msgstr "תהליך העדכון לא הושלם בהצלחה. נא דווח את הבעיה בקהילת ownCloud." #: js/update.js:18 msgid "The update was successful. Redirecting you to ownCloud now." -msgstr "" +msgstr "תהליך העדכון הסתיים בהצלחה. עכשיו מנתב אותך אל ownCloud." #: lostpassword/controller.php:48 msgid "ownCloud password reset" @@ -411,7 +411,7 @@ msgstr "איפוס שליחת דוא״ל." msgid "Request failed!" msgstr "הבקשה נכשלה!" -#: lostpassword/templates/lostpassword.php:11 templates/installation.php:39 +#: lostpassword/templates/lostpassword.php:11 templates/installation.php:40 #: templates/login.php:28 msgid "Username" msgstr "שם משתמש" @@ -492,65 +492,65 @@ msgstr "ללא מחולל מספרים אקראיים מאובטח תוקף יכ msgid "" "Your data directory and files are probably accessible from the internet " "because the .htaccess file does not work." -msgstr "" +msgstr "תיקיית וקבצי המידע שלך כנראה נגישים מהאינטרנט מכיוון שקובץ ה.htaccess לא עובד." #: templates/installation.php:32 msgid "" "For information how to properly configure your server, please see the documentation." -msgstr "" +msgstr "לקבלת מידע להגדרה נכונה של השרת שלך, ראה את התיעוד." #: templates/installation.php:36 msgid "Create an admin account" msgstr "יצירת חשבון מנהל" -#: templates/installation.php:52 +#: templates/installation.php:54 msgid "Advanced" msgstr "מתקדם" -#: templates/installation.php:54 +#: templates/installation.php:56 msgid "Data folder" msgstr "תיקיית נתונים" -#: templates/installation.php:61 +#: templates/installation.php:65 msgid "Configure the database" msgstr "הגדרת מסד הנתונים" -#: templates/installation.php:66 templates/installation.php:77 -#: templates/installation.php:87 templates/installation.php:97 +#: templates/installation.php:70 templates/installation.php:82 +#: templates/installation.php:93 templates/installation.php:104 msgid "will be used" msgstr "ינוצלו" -#: templates/installation.php:109 +#: templates/installation.php:117 msgid "Database user" msgstr "שם משתמש במסד הנתונים" -#: templates/installation.php:113 +#: templates/installation.php:122 msgid "Database password" msgstr "ססמת מסד הנתונים" -#: templates/installation.php:117 +#: templates/installation.php:127 msgid "Database name" msgstr "שם מסד הנתונים" -#: templates/installation.php:125 +#: templates/installation.php:137 msgid "Database tablespace" msgstr "מרחב הכתובות של מסד הנתונים" -#: templates/installation.php:131 +#: templates/installation.php:144 msgid "Database host" msgstr "שרת בסיס נתונים" -#: templates/installation.php:136 +#: templates/installation.php:150 msgid "Finish setup" msgstr "סיום התקנה" -#: templates/layout.guest.php:33 +#: templates/layout.guest.php:35 msgid "web services under your control" msgstr "שירותי רשת בשליטתך" -#: templates/layout.user.php:48 +#: templates/layout.user.php:53 msgid "Log out" msgstr "התנתקות" @@ -582,7 +582,7 @@ msgstr "כניסה" #: templates/login.php:49 msgid "Alternative Logins" -msgstr "" +msgstr "כניסות אלטרנטיביות" #: templates/part.pagenavi.php:3 msgid "prev" diff --git a/l10n/he/files.po b/l10n/he/files.po index aa31effeb9..569dbeb0da 100644 --- a/l10n/he/files.po +++ b/l10n/he/files.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2013-02-22 00:06+0100\n" -"PO-Revision-Date: 2013-02-20 23:30+0000\n" +"POT-Creation-Date: 2013-02-25 00:05+0100\n" +"PO-Revision-Date: 2013-02-24 12:30+0000\n" "Last-Translator: I Robot \n" "Language-Team: Hebrew (http://www.transifex.com/projects/p/owncloud/language/he/)\n" "MIME-Version: 1.0\n" @@ -54,27 +54,27 @@ msgid "" "the HTML form" msgstr "הקובץ שהועלה חרג מההנחיה MAX_FILE_SIZE שצוינה בטופס ה־HTML" -#: ajax/upload.php:31 +#: ajax/upload.php:30 msgid "The uploaded file was only partially uploaded" msgstr "הקובץ שהועלה הועלה בצורה חלקית" -#: ajax/upload.php:32 +#: ajax/upload.php:31 msgid "No file was uploaded" msgstr "לא הועלו קבצים" -#: ajax/upload.php:33 +#: ajax/upload.php:32 msgid "Missing a temporary folder" msgstr "תיקייה זמנית חסרה" -#: ajax/upload.php:34 +#: ajax/upload.php:33 msgid "Failed to write to disk" msgstr "הכתיבה לכונן נכשלה" -#: ajax/upload.php:52 +#: ajax/upload.php:51 msgid "Not enough storage available" msgstr "" -#: ajax/upload.php:83 +#: ajax/upload.php:82 msgid "Invalid directory." msgstr "" @@ -84,7 +84,7 @@ msgstr "קבצים" #: js/fileactions.js:125 msgid "Delete permanently" -msgstr "" +msgstr "מחק לצמיתות" #: js/fileactions.js:127 templates/index.php:91 templates/index.php:92 msgid "Delete" diff --git a/l10n/he/files_trashbin.po b/l10n/he/files_trashbin.po index fc348ed86c..0f5b6dca9e 100644 --- a/l10n/he/files_trashbin.po +++ b/l10n/he/files_trashbin.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Gilad Naaman , 2013. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2013-02-22 00:06+0100\n" -"PO-Revision-Date: 2013-02-20 23:32+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2013-02-25 00:05+0100\n" +"PO-Revision-Date: 2013-02-24 12:30+0000\n" +"Last-Translator: Gilad Naaman \n" "Language-Team: Hebrew (http://www.transifex.com/projects/p/owncloud/language/he/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -20,24 +21,24 @@ msgstr "" #: ajax/delete.php:40 #, php-format msgid "Couldn't delete %s permanently" -msgstr "" +msgstr "בלתי אפשרי למחוק את %s לצמיתות" #: ajax/undelete.php:41 #, php-format msgid "Couldn't restore %s" -msgstr "" +msgstr "בלתי אפשרי לשחזר את %s" #: js/trash.js:7 js/trash.js:96 msgid "perform restore operation" -msgstr "" +msgstr "בצע פעולת שחזור" #: js/trash.js:34 msgid "delete file permanently" -msgstr "" +msgstr "מחק קובץ לצמיתות" #: js/trash.js:121 msgid "Delete permanently" -msgstr "" +msgstr "מחק לצמיתות" #: js/trash.js:151 templates/index.php:17 msgid "Name" @@ -45,7 +46,7 @@ msgstr "שם" #: js/trash.js:152 templates/index.php:27 msgid "Deleted" -msgstr "" +msgstr "נמחק" #: js/trash.js:161 msgid "1 folder" @@ -65,11 +66,11 @@ msgstr "{count} קבצים" #: templates/index.php:9 msgid "Nothing in here. Your trash bin is empty!" -msgstr "" +msgstr "שום דבר כאן. סל המחזור שלך ריק!" #: templates/index.php:20 templates/index.php:22 msgid "Restore" -msgstr "" +msgstr "שחזר" #: templates/index.php:30 templates/index.php:31 msgid "Delete" diff --git a/l10n/he/settings.po b/l10n/he/settings.po index 67cfba57dd..72e496d262 100644 --- a/l10n/he/settings.po +++ b/l10n/he/settings.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2013-02-22 00:06+0100\n" -"PO-Revision-Date: 2013-02-20 23:30+0000\n" +"POT-Creation-Date: 2013-02-25 00:05+0100\n" +"PO-Revision-Date: 2013-02-24 12:20+0000\n" "Last-Translator: I Robot \n" "Language-Team: Hebrew (http://www.transifex.com/projects/p/owncloud/language/he/)\n" "MIME-Version: 1.0\n" @@ -25,8 +25,8 @@ msgstr "" msgid "Unable to load list from App Store" msgstr "לא ניתן לטעון רשימה מה־App Store" -#: ajax/changedisplayname.php:23 ajax/removeuser.php:15 ajax/setquota.php:15 -#: ajax/togglegroups.php:18 +#: ajax/changedisplayname.php:23 ajax/removeuser.php:15 ajax/setquota.php:17 +#: ajax/togglegroups.php:20 msgid "Authentication error" msgstr "שגיאת הזדהות" @@ -74,12 +74,12 @@ msgstr "בקשה לא חוקית" msgid "Admins can't remove themself from the admin group" msgstr "מנהלים לא יכולים להסיר את עצמם מקבוצת המנהלים" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:30 #, php-format msgid "Unable to add user to group %s" msgstr "לא ניתן להוסיף משתמש לקבוצה %s" -#: ajax/togglegroups.php:34 +#: ajax/togglegroups.php:36 #, php-format msgid "Unable to remove user from group %s" msgstr "לא ניתן להסיר משתמש מהקבוצה %s" @@ -320,11 +320,11 @@ msgstr "" msgid "More" msgstr "יותר" -#: templates/admin.php:227 templates/personal.php:98 +#: templates/admin.php:227 templates/personal.php:102 msgid "Version" msgstr "גרסא" -#: templates/admin.php:230 templates/personal.php:100 +#: templates/admin.php:230 templates/personal.php:105 msgid "" "Developed by the ownCloud community, the AGPL." msgstr "פותח על די קהילתownCloud, קוד המקור מוגן ברישיון AGPL." -#: templates/apps.php:10 +#: templates/apps.php:11 msgid "Add your App" msgstr "הוספת היישום שלך" -#: templates/apps.php:11 +#: templates/apps.php:12 msgid "More Apps" msgstr "יישומים נוספים" -#: templates/apps.php:24 +#: templates/apps.php:28 msgid "Select an App" msgstr "בחירת יישום" -#: templates/apps.php:28 +#: templates/apps.php:34 msgid "See application page at apps.owncloud.com" msgstr "צפה בעמוד הישום ב apps.owncloud.com" -#: templates/apps.php:29 +#: templates/apps.php:36 msgid "-licensed by " msgstr "ברישיון לטובת " -#: templates/apps.php:31 +#: templates/apps.php:38 msgid "Update" msgstr "עדכון" -#: templates/help.php:3 +#: templates/help.php:4 msgid "User Documentation" msgstr "תיעוד משתמש" -#: templates/help.php:4 +#: templates/help.php:6 msgid "Administrator Documentation" msgstr "תיעוד מנהלים" -#: templates/help.php:6 +#: templates/help.php:9 msgid "Online Documentation" msgstr "תיעוד מקוון" -#: templates/help.php:7 +#: templates/help.php:11 msgid "Forum" msgstr "פורום" -#: templates/help.php:9 +#: templates/help.php:14 msgid "Bugtracker" msgstr "" -#: templates/help.php:11 +#: templates/help.php:17 msgid "Commercial Support" msgstr "תמיכה בתשלום" @@ -387,79 +387,79 @@ msgstr "תמיכה בתשלום" msgid "You have used %s of the available %s" msgstr "השתמשת ב־%s מתוך %s הזמינים לך" -#: templates/personal.php:14 +#: templates/personal.php:15 msgid "Get the apps to sync your files" -msgstr "" +msgstr "השג את האפליקציות על מנת לסנכרן את הקבצים שלך" -#: templates/personal.php:25 +#: templates/personal.php:26 msgid "Show First Run Wizard again" msgstr "" -#: templates/personal.php:36 templates/users.php:23 templates/users.php:79 +#: templates/personal.php:37 templates/users.php:23 templates/users.php:79 msgid "Password" msgstr "ססמה" -#: templates/personal.php:37 +#: templates/personal.php:38 msgid "Your password was changed" msgstr "הססמה שלך הוחלפה" -#: templates/personal.php:38 +#: templates/personal.php:39 msgid "Unable to change your password" msgstr "לא ניתן לשנות את הססמה שלך" -#: templates/personal.php:39 +#: templates/personal.php:40 msgid "Current password" msgstr "ססמה נוכחית" -#: templates/personal.php:40 +#: templates/personal.php:42 msgid "New password" msgstr "ססמה חדשה" -#: templates/personal.php:42 +#: templates/personal.php:44 msgid "Change password" msgstr "שינוי ססמה" -#: templates/personal.php:54 templates/users.php:78 +#: templates/personal.php:56 templates/users.php:78 msgid "Display Name" msgstr "" -#: templates/personal.php:55 +#: templates/personal.php:57 msgid "Your display name was changed" msgstr "" -#: templates/personal.php:56 +#: templates/personal.php:58 msgid "Unable to change your display name" msgstr "" -#: templates/personal.php:59 +#: templates/personal.php:61 msgid "Change display name" msgstr "" -#: templates/personal.php:68 +#: templates/personal.php:70 msgid "Email" msgstr "דוא״ל" -#: templates/personal.php:69 +#: templates/personal.php:72 msgid "Your email address" msgstr "כתובת הדוא״ל שלך" -#: templates/personal.php:70 +#: templates/personal.php:73 msgid "Fill in an email address to enable password recovery" msgstr "נא למלא את כתובת הדוא״ל שלך כדי לאפשר שחזור ססמה" -#: templates/personal.php:76 templates/personal.php:77 +#: templates/personal.php:79 templates/personal.php:80 msgid "Language" msgstr "פה" -#: templates/personal.php:82 +#: templates/personal.php:86 msgid "Help translate" msgstr "עזרה בתרגום" -#: templates/personal.php:87 +#: templates/personal.php:91 msgid "WebDAV" msgstr "" -#: templates/personal.php:89 +#: templates/personal.php:93 msgid "Use this address to connect to your ownCloud in your file manager" msgstr "השתמש בכתובת זאת על מנת להתחבר אל ownCloud דרך סייר קבצים." diff --git a/l10n/he/user_ldap.po b/l10n/he/user_ldap.po index cd67250d86..0052056c21 100644 --- a/l10n/he/user_ldap.po +++ b/l10n/he/user_ldap.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2013-02-08 00:10+0100\n" -"PO-Revision-Date: 2013-02-07 23:11+0000\n" +"POT-Creation-Date: 2013-02-25 00:05+0100\n" +"PO-Revision-Date: 2013-02-24 12:30+0000\n" "Last-Translator: I Robot \n" "Language-Team: Hebrew (http://www.transifex.com/projects/p/owncloud/language/he/)\n" "MIME-Version: 1.0\n" @@ -22,17 +22,17 @@ msgstr "" msgid "Failed to delete the server configuration" msgstr "" -#: ajax/testConfiguration.php:35 +#: ajax/testConfiguration.php:36 msgid "The configuration is valid and the connection could be established!" msgstr "" -#: ajax/testConfiguration.php:37 +#: ajax/testConfiguration.php:39 msgid "" "The configuration is valid, but the Bind failed. Please check the server " "settings and credentials." msgstr "" -#: ajax/testConfiguration.php:40 +#: ajax/testConfiguration.php:43 msgid "" "The configuration is invalid. Please look in the ownCloud log for further " "details." @@ -87,224 +87,224 @@ msgstr "" msgid "Server configuration" msgstr "" -#: templates/settings.php:17 +#: templates/settings.php:18 msgid "Add Server Configuration" msgstr "" -#: templates/settings.php:21 +#: templates/settings.php:23 msgid "Host" msgstr "מארח" -#: templates/settings.php:21 +#: templates/settings.php:25 msgid "" "You can omit the protocol, except you require SSL. Then start with ldaps://" msgstr "" -#: templates/settings.php:22 +#: templates/settings.php:26 msgid "Base DN" msgstr "" -#: templates/settings.php:22 +#: templates/settings.php:27 msgid "One Base DN per line" msgstr "" -#: templates/settings.php:22 +#: templates/settings.php:28 msgid "You can specify Base DN for users and groups in the Advanced tab" msgstr "" -#: templates/settings.php:23 +#: templates/settings.php:30 msgid "User DN" msgstr "DN משתמש" -#: templates/settings.php:23 +#: templates/settings.php:32 msgid "" "The DN of the client user with which the bind shall be done, e.g. " "uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password " "empty." msgstr "" -#: templates/settings.php:24 +#: templates/settings.php:33 msgid "Password" msgstr "סיסמא" -#: templates/settings.php:24 +#: templates/settings.php:36 msgid "For anonymous access, leave DN and Password empty." msgstr "לגישה אנונימית, השאר את הDM והסיסמא ריקים." -#: templates/settings.php:25 +#: templates/settings.php:37 msgid "User Login Filter" msgstr "סנן כניסת משתמש" -#: templates/settings.php:25 +#: templates/settings.php:40 #, php-format msgid "" "Defines the filter to apply, when login is attempted. %%uid replaces the " "username in the login action." msgstr "" -#: templates/settings.php:25 +#: templates/settings.php:41 #, php-format msgid "use %%uid placeholder, e.g. \"uid=%%uid\"" msgstr "" -#: templates/settings.php:26 +#: templates/settings.php:42 msgid "User List Filter" msgstr "סנן רשימת משתמשים" -#: templates/settings.php:26 +#: templates/settings.php:45 msgid "Defines the filter to apply, when retrieving users." msgstr "" -#: templates/settings.php:26 +#: templates/settings.php:46 msgid "without any placeholder, e.g. \"objectClass=person\"." msgstr "" -#: templates/settings.php:27 +#: templates/settings.php:47 msgid "Group Filter" msgstr "סנן קבוצה" -#: templates/settings.php:27 +#: templates/settings.php:50 msgid "Defines the filter to apply, when retrieving groups." msgstr "" -#: templates/settings.php:27 +#: templates/settings.php:51 msgid "without any placeholder, e.g. \"objectClass=posixGroup\"." msgstr "" -#: templates/settings.php:31 +#: templates/settings.php:55 msgid "Connection Settings" msgstr "" -#: templates/settings.php:33 +#: templates/settings.php:57 msgid "Configuration Active" msgstr "" -#: templates/settings.php:33 +#: templates/settings.php:57 msgid "When unchecked, this configuration will be skipped." msgstr "" -#: templates/settings.php:34 +#: templates/settings.php:58 msgid "Port" -msgstr "" +msgstr "פורט" -#: templates/settings.php:35 +#: templates/settings.php:59 msgid "Backup (Replica) Host" msgstr "" -#: templates/settings.php:35 +#: templates/settings.php:59 msgid "" "Give an optional backup host. It must be a replica of the main LDAP/AD " "server." msgstr "" -#: templates/settings.php:36 +#: templates/settings.php:60 msgid "Backup (Replica) Port" msgstr "" -#: templates/settings.php:37 +#: templates/settings.php:61 msgid "Disable Main Server" msgstr "" -#: templates/settings.php:37 +#: templates/settings.php:61 msgid "When switched on, ownCloud will only connect to the replica server." msgstr "" -#: templates/settings.php:38 +#: templates/settings.php:62 msgid "Use TLS" msgstr "" -#: templates/settings.php:38 +#: templates/settings.php:62 msgid "Do not use it additionally for LDAPS connections, it will fail." msgstr "" -#: templates/settings.php:39 +#: templates/settings.php:63 msgid "Case insensitve LDAP server (Windows)" msgstr "" -#: templates/settings.php:40 +#: templates/settings.php:64 msgid "Turn off SSL certificate validation." msgstr "" -#: templates/settings.php:40 +#: templates/settings.php:64 msgid "" "If connection only works with this option, import the LDAP server's SSL " "certificate in your ownCloud server." msgstr "" -#: templates/settings.php:40 +#: templates/settings.php:64 msgid "Not recommended, use for testing only." msgstr "" -#: templates/settings.php:41 +#: templates/settings.php:65 msgid "in seconds. A change empties the cache." msgstr "בשניות. שינוי מרוקן את המטמון." -#: templates/settings.php:43 +#: templates/settings.php:67 msgid "Directory Settings" msgstr "" -#: templates/settings.php:45 +#: templates/settings.php:69 msgid "User Display Name Field" msgstr "" -#: templates/settings.php:45 +#: templates/settings.php:69 msgid "The LDAP attribute to use to generate the user`s ownCloud name." msgstr "" -#: templates/settings.php:46 +#: templates/settings.php:70 msgid "Base User Tree" msgstr "" -#: templates/settings.php:46 +#: templates/settings.php:70 msgid "One User Base DN per line" msgstr "" -#: templates/settings.php:47 +#: templates/settings.php:71 msgid "User Search Attributes" msgstr "" -#: templates/settings.php:47 templates/settings.php:50 +#: templates/settings.php:71 templates/settings.php:74 msgid "Optional; one attribute per line" msgstr "" -#: templates/settings.php:48 +#: templates/settings.php:72 msgid "Group Display Name Field" msgstr "" -#: templates/settings.php:48 +#: templates/settings.php:72 msgid "The LDAP attribute to use to generate the groups`s ownCloud name." msgstr "" -#: templates/settings.php:49 +#: templates/settings.php:73 msgid "Base Group Tree" msgstr "" -#: templates/settings.php:49 +#: templates/settings.php:73 msgid "One Group Base DN per line" msgstr "" -#: templates/settings.php:50 +#: templates/settings.php:74 msgid "Group Search Attributes" msgstr "" -#: templates/settings.php:51 +#: templates/settings.php:75 msgid "Group-Member association" msgstr "" -#: templates/settings.php:53 +#: templates/settings.php:77 msgid "Special Attributes" msgstr "" -#: templates/settings.php:56 +#: templates/settings.php:80 msgid "in bytes" msgstr "בבתים" -#: templates/settings.php:58 +#: templates/settings.php:82 msgid "" "Leave empty for user name (default). Otherwise, specify an LDAP/AD " "attribute." msgstr "" -#: templates/settings.php:62 +#: templates/settings.php:86 msgid "Help" msgstr "עזרה" diff --git a/l10n/my_MM/core.po b/l10n/my_MM/core.po index f681f707da..f7b5644106 100644 --- a/l10n/my_MM/core.po +++ b/l10n/my_MM/core.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2013-02-22 00:06+0100\n" -"PO-Revision-Date: 2013-02-21 11:20+0000\n" +"POT-Creation-Date: 2013-02-25 00:05+0100\n" +"PO-Revision-Date: 2013-02-24 11:20+0000\n" "Last-Translator: Pyae Sone \n" "Language-Team: Burmese (Myanmar) (http://www.transifex.com/projects/p/owncloud/language/my_MM/)\n" "MIME-Version: 1.0\n" @@ -18,24 +18,24 @@ msgstr "" "Language: my_MM\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: ajax/share.php:85 +#: ajax/share.php:97 #, php-format msgid "User %s shared a file with you" msgstr "" -#: ajax/share.php:87 +#: ajax/share.php:99 #, php-format msgid "User %s shared a folder with you" msgstr "" -#: ajax/share.php:89 +#: ajax/share.php:101 #, php-format msgid "" "User %s shared the file \"%s\" with you. It is available for download here: " "%s" msgstr "" -#: ajax/share.php:91 +#: ajax/share.php:104 #, php-format msgid "" "User %s shared the folder \"%s\" with you. It is available for download " @@ -48,7 +48,7 @@ msgstr "" #: ajax/vcategories/add.php:30 msgid "No category to add?" -msgstr "" +msgstr "ထည့်ရန်ခေါင်းစဉ်မရှိဘူးလား" #: ajax/vcategories/add.php:37 #, php-format @@ -74,88 +74,88 @@ msgstr "" #: ajax/vcategories/delete.php:35 js/oc-vcategories.js:136 msgid "No categories selected for deletion." -msgstr "" +msgstr "ဖျက်ရန်အတွက်ခေါင်းစဉ်မရွေးထားပါ" #: ajax/vcategories/removeFromFavorites.php:35 #, php-format msgid "Error removing %s from favorites." msgstr "" -#: js/config.php:32 +#: js/config.php:34 msgid "Sunday" msgstr "" -#: js/config.php:32 +#: js/config.php:35 msgid "Monday" msgstr "" -#: js/config.php:32 +#: js/config.php:36 msgid "Tuesday" msgstr "" -#: js/config.php:32 +#: js/config.php:37 msgid "Wednesday" msgstr "" -#: js/config.php:32 +#: js/config.php:38 msgid "Thursday" msgstr "" -#: js/config.php:32 +#: js/config.php:39 msgid "Friday" msgstr "" -#: js/config.php:32 +#: js/config.php:40 msgid "Saturday" msgstr "" -#: js/config.php:33 +#: js/config.php:45 msgid "January" -msgstr "" +msgstr "ဇန်နဝါရီ" -#: js/config.php:33 +#: js/config.php:46 msgid "February" -msgstr "" +msgstr "ဖေဖော်ဝါရီ" -#: js/config.php:33 +#: js/config.php:47 msgid "March" -msgstr "" +msgstr "မတ်" -#: js/config.php:33 +#: js/config.php:48 msgid "April" -msgstr "" +msgstr "ဧပြီ" -#: js/config.php:33 +#: js/config.php:49 msgid "May" -msgstr "" +msgstr "မေ" -#: js/config.php:33 +#: js/config.php:50 msgid "June" -msgstr "" +msgstr "ဇွန်" -#: js/config.php:33 +#: js/config.php:51 msgid "July" -msgstr "" +msgstr "ဇူလိုင်" -#: js/config.php:33 +#: js/config.php:52 msgid "August" -msgstr "" +msgstr "ဩဂုတ်" -#: js/config.php:33 +#: js/config.php:53 msgid "September" -msgstr "" +msgstr "စက်တင်ဘာ" -#: js/config.php:33 +#: js/config.php:54 msgid "October" -msgstr "" +msgstr "အောက်တိုဘာ" -#: js/config.php:33 +#: js/config.php:55 msgid "November" -msgstr "" +msgstr "နိုဝင်ဘာ" -#: js/config.php:33 +#: js/config.php:56 msgid "December" -msgstr "" +msgstr "ဒီဇင်ဘာ" #: js/js.js:286 msgid "Settings" @@ -215,23 +215,23 @@ msgstr "နှစ် အရင်က" #: js/oc-dialogs.js:126 msgid "Choose" -msgstr "" +msgstr "ရွေးချယ်" #: js/oc-dialogs.js:146 js/oc-dialogs.js:166 msgid "Cancel" -msgstr "" +msgstr "ပယ်ဖျက်မည်" #: js/oc-dialogs.js:162 msgid "No" -msgstr "" +msgstr "မဟုတ်ဘူး" #: js/oc-dialogs.js:163 msgid "Yes" -msgstr "" +msgstr "ဟုတ်" #: js/oc-dialogs.js:180 msgid "Ok" -msgstr "" +msgstr "အိုကေ" #: js/oc-vcategories.js:5 js/oc-vcategories.js:85 js/oc-vcategories.js:102 #: js/oc-vcategories.js:117 js/oc-vcategories.js:132 js/oc-vcategories.js:162 @@ -292,9 +292,9 @@ msgstr "" msgid "Password protect" msgstr "" -#: js/share.js:185 templates/installation.php:44 templates/login.php:35 +#: js/share.js:185 templates/installation.php:46 templates/login.php:35 msgid "Password" -msgstr "" +msgstr "စကားဝှက်" #: js/share.js:189 msgid "Email link to person" @@ -306,15 +306,15 @@ msgstr "" #: js/share.js:194 msgid "Set expiration date" -msgstr "" +msgstr "သက်တမ်းကုန်ဆုံးမည့်ရက်သတ်မှတ်မည်" #: js/share.js:195 msgid "Expiration date" -msgstr "" +msgstr "သက်တမ်းကုန်ဆုံးမည့်ရက်" #: js/share.js:227 msgid "Share via email:" -msgstr "" +msgstr "အီးမေးလ်ဖြင့်ဝေမျှမည် -" #: js/share.js:229 msgid "No people found" @@ -322,7 +322,7 @@ msgstr "" #: js/share.js:256 msgid "Resharing is not allowed" -msgstr "" +msgstr "ပြန်လည်ဝေမျှခြင်းခွင့်မပြုပါ" #: js/share.js:292 msgid "Shared in {item} with {user}" @@ -334,7 +334,7 @@ msgstr "" #: js/share.js:325 msgid "can edit" -msgstr "" +msgstr "ပြင်ဆင်နိုင်" #: js/share.js:327 msgid "access control" @@ -342,7 +342,7 @@ msgstr "" #: js/share.js:330 msgid "create" -msgstr "" +msgstr "ဖန်တီးမည်" #: js/share.js:333 msgid "update" @@ -350,15 +350,15 @@ msgstr "" #: js/share.js:336 msgid "delete" -msgstr "" +msgstr "ဖျက်မည်" #: js/share.js:339 msgid "share" -msgstr "" +msgstr "ဝေမျှမည်" #: js/share.js:373 js/share.js:569 msgid "Password protected" -msgstr "" +msgstr "စကားဝှက်ဖြင့်ကာကွယ်ထားသည်" #: js/share.js:582 msgid "Error unsetting expiration date" @@ -397,7 +397,7 @@ msgstr "" #: lostpassword/templates/lostpassword.php:3 msgid "You will receive a link to reset your password via Email." -msgstr "" +msgstr "အီးမေးလ်မှတစ်ဆင့် သင်၏စကားဝှက်ကို ပြန်ဖော်ရန်အတွက် Link တစ်ခုလက်ခံရရှိပါလိမ့်မယ်။" #: lostpassword/templates/lostpassword.php:5 msgid "Reset email send." @@ -407,10 +407,10 @@ msgstr "" msgid "Request failed!" msgstr "" -#: lostpassword/templates/lostpassword.php:11 templates/installation.php:39 +#: lostpassword/templates/lostpassword.php:11 templates/installation.php:40 #: templates/login.php:28 msgid "Username" -msgstr "" +msgstr "သုံးစွဲသူအမည်" #: lostpassword/templates/lostpassword.php:14 msgid "Request reset" @@ -418,15 +418,15 @@ msgstr "" #: lostpassword/templates/resetpassword.php:4 msgid "Your password was reset" -msgstr "" +msgstr "သင်၏စကားဝှက်ကိုပြန်ဖော်ပြီးပါပြီ။" #: lostpassword/templates/resetpassword.php:5 msgid "To login page" -msgstr "" +msgstr "ဝင်ရောက်သည့်စာမျက်နှာသို့" #: lostpassword/templates/resetpassword.php:8 msgid "New password" -msgstr "" +msgstr "စကားဝှက်အသစ်" #: lostpassword/templates/resetpassword.php:11 msgid "Reset password" @@ -446,7 +446,7 @@ msgstr "Apps" #: strings.php:8 msgid "Admin" -msgstr "" +msgstr "အက်ဒမင်" #: strings.php:9 msgid "Help" @@ -458,7 +458,7 @@ msgstr "" #: templates/404.php:12 msgid "Cloud not found" -msgstr "" +msgstr "မတွေ့ရှိမိပါ" #: templates/edit_categories_dialog.php:4 msgid "Edit categories" @@ -466,11 +466,11 @@ msgstr "" #: templates/edit_categories_dialog.php:16 msgid "Add" -msgstr "" +msgstr "ပေါင်းထည့်" #: templates/installation.php:23 templates/installation.php:30 msgid "Security Warning" -msgstr "" +msgstr "လုံခြုံရေးသတိပေးချက်" #: templates/installation.php:24 msgid "" @@ -499,54 +499,54 @@ msgstr "" #: templates/installation.php:36 msgid "Create an admin account" -msgstr "" - -#: templates/installation.php:52 -msgid "Advanced" -msgstr "" +msgstr "အက်ဒမင်အကောင့်တစ်ခုဖန်တီးမည်" #: templates/installation.php:54 -msgid "Data folder" -msgstr "" +msgid "Advanced" +msgstr "အဆင့်မြင့်" -#: templates/installation.php:61 +#: templates/installation.php:56 +msgid "Data folder" +msgstr "အချက်အလက်ဖိုလ်ဒါလ်" + +#: templates/installation.php:65 msgid "Configure the database" msgstr "" -#: templates/installation.php:66 templates/installation.php:77 -#: templates/installation.php:87 templates/installation.php:97 +#: templates/installation.php:70 templates/installation.php:82 +#: templates/installation.php:93 templates/installation.php:104 msgid "will be used" msgstr "" -#: templates/installation.php:109 -msgid "Database user" -msgstr "" - -#: templates/installation.php:113 -msgid "Database password" -msgstr "" - #: templates/installation.php:117 -msgid "Database name" -msgstr "" +msgid "Database user" +msgstr "Database သုံးစွဲသူ" -#: templates/installation.php:125 +#: templates/installation.php:122 +msgid "Database password" +msgstr "Database စကားဝှက်" + +#: templates/installation.php:127 +msgid "Database name" +msgstr "Database အမည်" + +#: templates/installation.php:137 msgid "Database tablespace" msgstr "" -#: templates/installation.php:131 +#: templates/installation.php:144 msgid "Database host" msgstr "" -#: templates/installation.php:136 +#: templates/installation.php:150 msgid "Finish setup" -msgstr "" +msgstr "တပ်ဆင်ခြင်းပြီးပါပြီ။" -#: templates/layout.guest.php:33 +#: templates/layout.guest.php:35 msgid "web services under your control" -msgstr "" +msgstr "သင်၏ထိန်းချုပ်မှု့အောက်တွင်ရှိသော Web services" -#: templates/layout.user.php:48 +#: templates/layout.user.php:53 msgid "Log out" msgstr "" @@ -566,15 +566,15 @@ msgstr "" #: templates/login.php:19 msgid "Lost your password?" -msgstr "" +msgstr "သင်၏စကားဝှက်ပျောက်သွားပြီလား။" #: templates/login.php:41 msgid "remember" -msgstr "" +msgstr "မှတ်မိစေသည်" #: templates/login.php:43 msgid "Log in" -msgstr "" +msgstr "ဝင်ရောက်ရန်" #: templates/login.php:49 msgid "Alternative Logins" @@ -582,11 +582,11 @@ msgstr "" #: templates/part.pagenavi.php:3 msgid "prev" -msgstr "" +msgstr "ယခင်" #: templates/part.pagenavi.php:20 msgid "next" -msgstr "" +msgstr "နောက်သို့" #: templates/update.php:3 #, php-format diff --git a/l10n/my_MM/files_sharing.po b/l10n/my_MM/files_sharing.po index 2886a4d02b..6c66538b0e 100644 --- a/l10n/my_MM/files_sharing.po +++ b/l10n/my_MM/files_sharing.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2013-02-21 00:14+0100\n" +"POT-Creation-Date: 2013-02-25 00:05+0100\n" "PO-Revision-Date: 2012-08-12 22:35+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Burmese (Myanmar) (http://www.transifex.com/projects/p/owncloud/language/my_MM/)\n" @@ -19,30 +19,30 @@ msgstr "" #: templates/authenticate.php:4 msgid "Password" -msgstr "" +msgstr "စကားဝှက်" #: templates/authenticate.php:6 msgid "Submit" msgstr "" -#: templates/public.php:9 +#: templates/public.php:10 #, php-format msgid "%s shared the folder %s with you" msgstr "" -#: templates/public.php:11 +#: templates/public.php:13 #, php-format msgid "%s shared the file %s with you" msgstr "" -#: templates/public.php:14 templates/public.php:30 +#: templates/public.php:19 templates/public.php:37 msgid "Download" msgstr "" -#: templates/public.php:29 +#: templates/public.php:34 msgid "No preview available for" msgstr "" -#: templates/public.php:35 +#: templates/public.php:43 msgid "web services under your control" -msgstr "" +msgstr "သင်၏ထိန်းချုပ်မှု့အောက်တွင်ရှိသော Web services" diff --git a/l10n/my_MM/lib.po b/l10n/my_MM/lib.po index 436088e71e..b2c72b85c5 100644 --- a/l10n/my_MM/lib.po +++ b/l10n/my_MM/lib.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2013-02-22 00:06+0100\n" -"PO-Revision-Date: 2013-02-21 11:20+0000\n" +"POT-Creation-Date: 2013-02-25 00:05+0100\n" +"PO-Revision-Date: 2013-02-24 08:40+0000\n" "Last-Translator: Pyae Sone \n" "Language-Team: Burmese (Myanmar) (http://www.transifex.com/projects/p/owncloud/language/my_MM/)\n" "MIME-Version: 1.0\n" @@ -40,7 +40,7 @@ msgstr "Apps" #: app.php:406 msgid "Admin" -msgstr "" +msgstr "အက်ဒမင်" #: files.php:202 msgid "ZIP download is turned off." @@ -178,7 +178,7 @@ msgid "" "because the WebDAV interface seems to be broken." msgstr "" -#: setup.php:651 +#: setup.php:650 #, php-format msgid "Please double check the installation guides." msgstr "" diff --git a/l10n/my_MM/settings.po b/l10n/my_MM/settings.po index ce5041c02e..bb7c8afa2d 100644 --- a/l10n/my_MM/settings.po +++ b/l10n/my_MM/settings.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2013-02-22 00:06+0100\n" +"POT-Creation-Date: 2013-02-25 00:05+0100\n" "PO-Revision-Date: 2011-07-25 16:05+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Burmese (Myanmar) (http://www.transifex.com/projects/p/owncloud/language/my_MM/)\n" @@ -21,8 +21,8 @@ msgstr "" msgid "Unable to load list from App Store" msgstr "" -#: ajax/changedisplayname.php:23 ajax/removeuser.php:15 ajax/setquota.php:15 -#: ajax/togglegroups.php:18 +#: ajax/changedisplayname.php:23 ajax/removeuser.php:15 ajax/setquota.php:17 +#: ajax/togglegroups.php:20 msgid "Authentication error" msgstr "ခွင့်ပြုချက်မအောင်မြင်" @@ -70,12 +70,12 @@ msgstr "" msgid "Admins can't remove themself from the admin group" msgstr "" -#: ajax/togglegroups.php:28 +#: ajax/togglegroups.php:30 #, php-format msgid "Unable to add user to group %s" msgstr "" -#: ajax/togglegroups.php:34 +#: ajax/togglegroups.php:36 #, php-format msgid "Unable to remove user from group %s" msgstr "" @@ -167,7 +167,7 @@ msgstr "" #: templates/admin.php:15 msgid "Security Warning" -msgstr "" +msgstr "လုံခြုံရေးသတိပေးချက်" #: templates/admin.php:18 msgid "" @@ -316,11 +316,11 @@ msgstr "" msgid "More" msgstr "" -#: templates/admin.php:227 templates/personal.php:98 +#: templates/admin.php:227 templates/personal.php:102 msgid "Version" msgstr "" -#: templates/admin.php:230 templates/personal.php:100 +#: templates/admin.php:230 templates/personal.php:105 msgid "" "Developed by the ownCloud community, the AGPL." msgstr "" -#: templates/apps.php:10 +#: templates/apps.php:11 msgid "Add your App" msgstr "" -#: templates/apps.php:11 +#: templates/apps.php:12 msgid "More Apps" msgstr "" -#: templates/apps.php:24 +#: templates/apps.php:28 msgid "Select an App" msgstr "" -#: templates/apps.php:28 +#: templates/apps.php:34 msgid "See application page at apps.owncloud.com" msgstr "" -#: templates/apps.php:29 +#: templates/apps.php:36 msgid "-licensed by " msgstr "" -#: templates/apps.php:31 +#: templates/apps.php:38 msgid "Update" msgstr "" -#: templates/help.php:3 +#: templates/help.php:4 msgid "User Documentation" msgstr "" -#: templates/help.php:4 +#: templates/help.php:6 msgid "Administrator Documentation" msgstr "" -#: templates/help.php:6 +#: templates/help.php:9 msgid "Online Documentation" msgstr "" -#: templates/help.php:7 +#: templates/help.php:11 msgid "Forum" msgstr "" -#: templates/help.php:9 +#: templates/help.php:14 msgid "Bugtracker" msgstr "" -#: templates/help.php:11 +#: templates/help.php:17 msgid "Commercial Support" msgstr "" @@ -383,79 +383,79 @@ msgstr "" msgid "You have used %s of the available %s" msgstr "" -#: templates/personal.php:14 +#: templates/personal.php:15 msgid "Get the apps to sync your files" msgstr "" -#: templates/personal.php:25 +#: templates/personal.php:26 msgid "Show First Run Wizard again" msgstr "" -#: templates/personal.php:36 templates/users.php:23 templates/users.php:79 +#: templates/personal.php:37 templates/users.php:23 templates/users.php:79 msgid "Password" -msgstr "" +msgstr "စကားဝှက်" -#: templates/personal.php:37 +#: templates/personal.php:38 msgid "Your password was changed" msgstr "" -#: templates/personal.php:38 +#: templates/personal.php:39 msgid "Unable to change your password" msgstr "" -#: templates/personal.php:39 +#: templates/personal.php:40 msgid "Current password" msgstr "" -#: templates/personal.php:40 -msgid "New password" -msgstr "" - #: templates/personal.php:42 +msgid "New password" +msgstr "စကားဝှက်အသစ်" + +#: templates/personal.php:44 msgid "Change password" msgstr "" -#: templates/personal.php:54 templates/users.php:78 +#: templates/personal.php:56 templates/users.php:78 msgid "Display Name" msgstr "" -#: templates/personal.php:55 +#: templates/personal.php:57 msgid "Your display name was changed" msgstr "" -#: templates/personal.php:56 +#: templates/personal.php:58 msgid "Unable to change your display name" msgstr "" -#: templates/personal.php:59 +#: templates/personal.php:61 msgid "Change display name" msgstr "" -#: templates/personal.php:68 +#: templates/personal.php:70 msgid "Email" msgstr "" -#: templates/personal.php:69 +#: templates/personal.php:72 msgid "Your email address" msgstr "" -#: templates/personal.php:70 +#: templates/personal.php:73 msgid "Fill in an email address to enable password recovery" msgstr "" -#: templates/personal.php:76 templates/personal.php:77 +#: templates/personal.php:79 templates/personal.php:80 msgid "Language" msgstr "" -#: templates/personal.php:82 +#: templates/personal.php:86 msgid "Help translate" msgstr "" -#: templates/personal.php:87 +#: templates/personal.php:91 msgid "WebDAV" msgstr "" -#: templates/personal.php:89 +#: templates/personal.php:93 msgid "Use this address to connect to your ownCloud in your file manager" msgstr "" diff --git a/l10n/my_MM/user_ldap.po b/l10n/my_MM/user_ldap.po index e990717a5f..918b95dbf3 100644 --- a/l10n/my_MM/user_ldap.po +++ b/l10n/my_MM/user_ldap.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2013-02-22 00:06+0100\n" +"POT-Creation-Date: 2013-02-25 00:05+0100\n" "PO-Revision-Date: 2012-08-12 22:45+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Burmese (Myanmar) (http://www.transifex.com/projects/p/owncloud/language/my_MM/)\n" @@ -124,7 +124,7 @@ msgstr "" #: templates/settings.php:33 msgid "Password" -msgstr "" +msgstr "စကားဝှက်" #: templates/settings.php:36 msgid "For anonymous access, leave DN and Password empty." diff --git a/l10n/templates/core.pot b/l10n/templates/core.pot index cecc39cb73..2a8f0615ac 100644 --- a/l10n/templates/core.pot +++ b/l10n/templates/core.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud Core 5.0.0\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" -"POT-Creation-Date: 2013-02-24 00:06+0100\n" +"POT-Creation-Date: 2013-02-25 00:05+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files.pot b/l10n/templates/files.pot index 47515fcf17..fc6f66258f 100644 --- a/l10n/templates/files.pot +++ b/l10n/templates/files.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud Core 5.0.0\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" -"POT-Creation-Date: 2013-02-24 00:05+0100\n" +"POT-Creation-Date: 2013-02-25 00:05+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_encryption.pot b/l10n/templates/files_encryption.pot index 473f5d0f60..eecfc2b566 100644 --- a/l10n/templates/files_encryption.pot +++ b/l10n/templates/files_encryption.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud Core 5.0.0\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" -"POT-Creation-Date: 2013-02-24 00:05+0100\n" +"POT-Creation-Date: 2013-02-25 00:05+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_external.pot b/l10n/templates/files_external.pot index 950996cb1d..45d9ce016f 100644 --- a/l10n/templates/files_external.pot +++ b/l10n/templates/files_external.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud Core 5.0.0\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" -"POT-Creation-Date: 2013-02-24 00:05+0100\n" +"POT-Creation-Date: 2013-02-25 00:05+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_sharing.pot b/l10n/templates/files_sharing.pot index 56f2cef992..3dd2659404 100644 --- a/l10n/templates/files_sharing.pot +++ b/l10n/templates/files_sharing.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud Core 5.0.0\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" -"POT-Creation-Date: 2013-02-24 00:05+0100\n" +"POT-Creation-Date: 2013-02-25 00:05+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_trashbin.pot b/l10n/templates/files_trashbin.pot index 7e19dd1d50..c0d9911e2a 100644 --- a/l10n/templates/files_trashbin.pot +++ b/l10n/templates/files_trashbin.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud Core 5.0.0\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" -"POT-Creation-Date: 2013-02-24 00:05+0100\n" +"POT-Creation-Date: 2013-02-25 00:05+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_versions.pot b/l10n/templates/files_versions.pot index 3f528d866d..2854191572 100644 --- a/l10n/templates/files_versions.pot +++ b/l10n/templates/files_versions.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud Core 5.0.0\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" -"POT-Creation-Date: 2013-02-24 00:05+0100\n" +"POT-Creation-Date: 2013-02-25 00:05+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/lib.pot b/l10n/templates/lib.pot index 521c5013b5..854f33470c 100644 --- a/l10n/templates/lib.pot +++ b/l10n/templates/lib.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud Core 5.0.0\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" -"POT-Creation-Date: 2013-02-24 00:06+0100\n" +"POT-Creation-Date: 2013-02-25 00:05+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/settings.pot b/l10n/templates/settings.pot index 04c6396995..c6fe848769 100644 --- a/l10n/templates/settings.pot +++ b/l10n/templates/settings.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud Core 5.0.0\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" -"POT-Creation-Date: 2013-02-24 00:06+0100\n" +"POT-Creation-Date: 2013-02-25 00:05+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/user_ldap.pot b/l10n/templates/user_ldap.pot index 396d0c8eae..d4c1c33115 100644 --- a/l10n/templates/user_ldap.pot +++ b/l10n/templates/user_ldap.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud Core 5.0.0\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" -"POT-Creation-Date: 2013-02-24 00:05+0100\n" +"POT-Creation-Date: 2013-02-25 00:05+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/user_webdavauth.pot b/l10n/templates/user_webdavauth.pot index f76cd4d18f..496d3c2f46 100644 --- a/l10n/templates/user_webdavauth.pot +++ b/l10n/templates/user_webdavauth.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud Core 5.0.0\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" -"POT-Creation-Date: 2013-02-24 00:05+0100\n" +"POT-Creation-Date: 2013-02-25 00:05+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/lib/app.php b/lib/app.php index e653c30b2d..2eb43a582e 100644 --- a/lib/app.php +++ b/lib/app.php @@ -223,7 +223,7 @@ class OC_App{ // check if the app is compatible with this version of ownCloud $info=OC_App::getAppInfo($app); $version=OC_Util::getVersion(); - if(!isset($info['require']) or ($version[0]>$info['require'])) { + if(!isset($info['require']) or !self::isAppVersionCompatible($version, $info['require'])) { OC_Log::write('core', 'App "'.$info['name'].'" can\'t be installed because it is' .' not compatible with this version of ownCloud', @@ -851,7 +851,7 @@ class OC_App{ foreach($apps as $app) { // check if the app is compatible with this version of ownCloud $info = OC_App::getAppInfo($app); - if(!isset($info['require']) or (($version[0].'.'.$version[1])>$info['require'])) { + if(!isset($info['require']) or !self::isAppVersionCompatible($version, $info['require'])) { OC_Log::write('core', 'App "'.$info['name'].'" ('.$app.') can\'t be used because it is' .' not compatible with this version of ownCloud', @@ -862,6 +862,36 @@ class OC_App{ } } + + /** + * Compares the app version with the owncloud version to see if the app + * requires a newer version than the currently active one + * @param array $owncloudVersions array with 3 entries: major minor bugfix + * @param string $appRequired the required version from the xml + * major.minor.bugfix + * @return boolean true if compatible, otherwise false + */ + public static function isAppVersionCompatible($owncloudVersions, $appRequired){ + $appVersions = explode('.', $appRequired); + + for($i=0; $iassign('errors', array(1 => array('error' => $error))); + $tmpl->printPage(); + + exit(); + } // regenerate session id periodically to avoid session fixation if (!isset($_SESSION['SID_CREATED'])) { diff --git a/lib/db.php b/lib/db.php index edbc2fe13e..fb2c027cdb 100644 --- a/lib/db.php +++ b/lib/db.php @@ -178,6 +178,13 @@ class OC_DB { $dsn = 'oci:dbname=//' . $host . '/' . $name; } break; + case 'mssql': + if ($port) { + $dsn='sqlsrv:Server='.$host.','.$port.';Database='.$name; + } else { + $dsn='sqlsrv:Server='.$host.';Database='.$name; + } + break; default: return false; } @@ -278,6 +285,15 @@ class OC_DB { $dsn['database'] = $user; } break; + case 'mssql': + $dsn = array( + 'phptype' => 'sqlsrv', + 'username' => $user, + 'password' => $pass, + 'hostspec' => $host, + 'database' => $name + ); + break; default: return false; } @@ -389,6 +405,13 @@ class OC_DB { $query = self::prepare('SELECT lastval() AS id'); $row = $query->execute()->fetchRow(); return $row['id']; + } + if( $type == 'mssql' ) { + if($table !== null) { + $prefix = OC_Config::getValue( "dbtableprefix", "oc_" ); + $table = str_replace( '*PREFIX*', $prefix, $table ); + } + return self::$connection->lastInsertId($table); }else{ if($table !== null) { $prefix = OC_Config::getValue( "dbtableprefix", "oc_" ); @@ -631,7 +654,7 @@ class OC_DB { } else { return true; } - } elseif( $type == 'pgsql' || $type == 'oci' || $type == 'mysql') { + } elseif( $type == 'pgsql' || $type == 'oci' || $type == 'mysql' || $type == 'mssql') { $query = 'INSERT INTO `' .$table . '` (' . implode(',', array_keys($input)) . ') SELECT \'' . implode('\',\'', array_values($input)) . '\' FROM ' . $table . ' WHERE '; @@ -691,7 +714,15 @@ class OC_DB { }elseif( $type == 'oci' ) { $query = str_replace( '`', '"', $query ); $query = str_ireplace( 'NOW()', 'CURRENT_TIMESTAMP', $query ); - } + }elseif( $type == 'mssql' ) { + $query = preg_replace( "/\`(.*?)`/", "[$1]", $query ); + $query = str_replace( 'NOW()', 'CURRENT_TIMESTAMP', $query ); + $query = str_replace( 'now()', 'CURRENT_TIMESTAMP', $query ); + $query = str_replace( 'LENGTH(', 'LEN(', $query ); + $query = str_replace( 'SUBSTR(', 'SUBSTRING(', $query ); + + $query = self::fixLimitClauseForMSSQL($query); + } // replace table name prefix $query = str_replace( '*PREFIX*', $prefix, $query ); @@ -699,6 +730,60 @@ class OC_DB { return $query; } + private static function fixLimitClauseForMSSQL($query) { + $limitLocation = stripos ($query, "LIMIT"); + + if ( $limitLocation === false ) { + return $query; + } + + // total == 0 means all results - not zero results + // + // First number is either total or offset, locate it by first space + // + $offset = substr ($query, $limitLocation + 5); + $offset = substr ($offset, 0, stripos ($offset, ' ')); + $offset = trim ($offset); + + // check for another parameter + if (stripos ($offset, ',') === false) { + // no more parameters + $offset = 0; + $total = intval ($offset); + } else { + // found another parameter + $offset = intval ($offset); + + $total = substr ($query, $limitLocation + 5); + $total = substr ($total, stripos ($total, ',')); + + $total = substr ($total, 0, stripos ($total, ' ')); + $total = intval ($total); + } + + $query = trim (substr ($query, 0, $limitLocation)); + + if ($offset == 0 && $total !== 0) { + if (strpos($query, "SELECT") === false) { + $query = "TOP {$total} " . $query; + } else { + $query = preg_replace('/SELECT(\s*DISTINCT)?/Dsi', 'SELECT$1 TOP '.$total, $query); + } + } else if ($offset > 0) { + $query = preg_replace('/SELECT(\s*DISTINCT)?/Dsi', 'SELECT$1 TOP(10000000) ', $query); + $query = 'SELECT * + FROM (SELECT sub2.*, ROW_NUMBER() OVER(ORDER BY sub2.line2) AS line3 + FROM (SELECT 1 AS line2, sub1.* FROM (' . $query . ') AS sub1) as sub2) AS sub3'; + + if ($total > 0) { + $query .= ' WHERE line3 BETWEEN ' . ($offset + 1) . ' AND ' . ($offset + $total); + } else { + $query .= ' WHERE line3 > ' . $offset; + } + } + return $query; + } + /** * @brief drop a table * @param string $tableName the table to drop @@ -850,19 +935,119 @@ class PDOStatementWrapper{ * make execute return the result instead of a bool */ public function execute($input=array()) { - $this->lastArguments=$input; - if(count($input)>0) { + $this->lastArguments = $input; + if (count($input) > 0) { + + if (!isset($type)) { + $type = OC_Config::getValue( "dbtype", "sqlite" ); + } + + if ($type == 'mssql') { + $input = $this->tryFixSubstringLastArgumentDataForMSSQL($input); + } + $result=$this->statement->execute($input); - }else{ + } else { $result=$this->statement->execute(); } - if($result) { + + if ($result) { return $this; - }else{ + } else { return false; } } + private function tryFixSubstringLastArgumentDataForMSSQL($input) { + $query = $this->statement->queryString; + $pos = stripos ($query, 'SUBSTRING'); + + if ( $pos === false) { + return; + } + + try { + $newQuery = ''; + + $cArg = 0; + + $inSubstring = false; + + // Create new query + for ($i = 0; $i < strlen ($query); $i++) { + if ($inSubstring == false) { + // Defines when we should start inserting values + if (substr ($query, $i, 9) == 'SUBSTRING') { + $inSubstring = true; + } + } else { + // Defines when we should stop inserting values + if (substr ($query, $i, 1) == ')') { + $inSubstring = false; + } + } + + if (substr ($query, $i, 1) == '?') { + // We found a question mark + if ($inSubstring) { + $newQuery .= $input[$cArg]; + + // + // Remove from input array + // + array_splice ($input, $cArg, 1); + } else { + $newQuery .= substr ($query, $i, 1); + $cArg++; + } + } else { + $newQuery .= substr ($query, $i, 1); + } + } + + // The global data we need + $name = OC_Config::getValue( "dbname", "owncloud" ); + $host = OC_Config::getValue( "dbhost", "" ); + $user = OC_Config::getValue( "dbuser", "" ); + $pass = OC_Config::getValue( "dbpassword", "" ); + if (strpos($host,':')) { + list($host, $port) = explode(':', $host, 2); + } else { + $port = false; + } + $opts = array(); + + if ($port) { + $dsn = 'sqlsrv:Server='.$host.','.$port.';Database='.$name; + } else { + $dsn = 'sqlsrv:Server='.$host.';Database='.$name; + } + + $PDO = new PDO($dsn, $user, $pass, $opts); + $PDO->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); + $PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + + $this->statement = $PDO->prepare($newQuery); + + $this->lastArguments = $input; + + return $input; + } catch (PDOException $e){ + $entry = 'PDO DB Error: "'.$e->getMessage().'"
    '; + $entry .= 'Offending command was: '.$this->statement->queryString .'
    '; + $entry .= 'Input parameters: ' .print_r($input, true).'
    '; + $entry .= 'Stack trace: ' .$e->getTraceAsString().'
    '; + OC_Log::write('core', $entry, OC_Log::FATAL); + OC_User::setUserId(null); + + // send http status 503 + header('HTTP/1.1 503 Service Temporarily Unavailable'); + header('Status: 503 Service Temporarily Unavailable'); + OC_Template::printErrorPage('Failed to connect to database'); + die ($entry); + } + } + /** * provide numRows */ diff --git a/lib/files/cache/cache.php b/lib/files/cache/cache.php index 3652dc7cf2..01e6e78826 100644 --- a/lib/files/cache/cache.php +++ b/lib/files/cache/cache.php @@ -500,8 +500,8 @@ class Cache { public function getIncomplete() { $query = \OC_DB::prepare('SELECT `path` FROM `*PREFIX*filecache`' . ' WHERE `storage` = ? AND `size` = -1 ORDER BY `fileid` DESC LIMIT 1'); - $query->execute(array($this->numericId)); - if ($row = $query->fetchRow()) { + $result = $query->execute(array($this->numericId)); + if ($row = $result->fetchRow()) { return $row['path']; } else { return false; diff --git a/lib/files/storage/common.php b/lib/files/storage/common.php index 8faacdf01d..f9c6bdfce0 100644 --- a/lib/files/storage/common.php +++ b/lib/files/storage/common.php @@ -97,8 +97,8 @@ abstract class Common implements \OC\Files\Storage\Storage { public function copy($path1, $path2) { $source=$this->fopen($path1, 'r'); $target=$this->fopen($path2, 'w'); - $count=\OC_Helper::streamCopy($source, $target); - return $count>0; + list($count, $result) = \OC_Helper::streamCopy($source, $target); + return $result; } /** diff --git a/lib/files/view.php b/lib/files/view.php index 9ac08c9808..f48d0c8b22 100644 --- a/lib/files/view.php +++ b/lib/files/view.php @@ -285,7 +285,7 @@ class View { } $target = $this->fopen($path, 'w'); if ($target) { - $count = \OC_Helper::streamCopy($data, $target); + list ($count, $result) = \OC_Helper::streamCopy($data, $target); fclose($target); fclose($data); if ($this->fakeRoot == Filesystem::getRoot()) { @@ -303,7 +303,7 @@ class View { ); } \OC_FileProxy::runPostProxies('file_put_contents', $absolutePath, $count); - return $count > 0; + return $result; } else { return false; } @@ -361,10 +361,9 @@ class View { } else { $source = $this->fopen($path1 . $postFix1, 'r'); $target = $this->fopen($path2 . $postFix2, 'w'); - $count = \OC_Helper::streamCopy($source, $target); + list($count, $result) = \OC_Helper::streamCopy($source, $target); list($storage1, $internalPath1) = Filesystem::resolvePath($absolutePath1 . $postFix1); $storage1->unlink($internalPath1); - $result = $count > 0; } if ($this->fakeRoot == Filesystem::getRoot()) { \OC_Hook::emit( @@ -444,7 +443,7 @@ class View { } else { $source = $this->fopen($path1 . $postFix1, 'r'); $target = $this->fopen($path2 . $postFix2, 'w'); - $result = \OC_Helper::streamCopy($source, $target); + list($count, $result) = \OC_Helper::streamCopy($source, $target); } if ($this->fakeRoot == Filesystem::getRoot()) { \OC_Hook::emit( diff --git a/lib/helper.php b/lib/helper.php index add5c66e7b..41985ca57a 100644 --- a/lib/helper.php +++ b/lib/helper.php @@ -513,11 +513,16 @@ class OC_Helper { if(!$source or !$target) { return false; } - $count=0; + $result = true; + $count = 0; while(!feof($source)) { - $count+=fwrite($target, fread($source, 8192)); + if ( ( $c = fwrite($target, fread($source, 8192)) ) === false) { + $result = false; + } else { + $count += $c; + } } - return $count; + return array($count, $result); } /** diff --git a/lib/l10n/my_MM.php b/lib/l10n/my_MM.php index cee6f65d22..d725a06a3a 100644 --- a/lib/l10n/my_MM.php +++ b/lib/l10n/my_MM.php @@ -2,6 +2,7 @@ "Help" => "အကူအညီ", "Users" => "သုံးစွဲသူ", "Apps" => "Apps", +"Admin" => "အက်ဒမင်", "ZIP download is turned off." => "ZIP ဒေါင်းလုတ်ကိုပိတ်ထားသည်", "Files need to be downloaded one by one." => "ဖိုင်များသည် တစ်ခုပြီး တစ်ခုဒေါင်းလုတ်ချရန်လိုအပ်သည်", "Back to Files" => "ဖိုင်သို့ပြန်သွားမည်", diff --git a/lib/public/files.php b/lib/public/files.php index c2945b200e..700bf57453 100644 --- a/lib/public/files.php +++ b/lib/public/files.php @@ -62,7 +62,8 @@ class Files { * @return int the number of bytes copied */ public static function streamCopy( $source, $target ) { - return(\OC_Helper::streamCopy( $source, $target )); + list($count, $result) = \OC_Helper::streamCopy( $source, $target ); + return $count; } /** diff --git a/lib/setup.php b/lib/setup.php index 19e4a82b51..fd5f3cd5be 100644 --- a/lib/setup.php +++ b/lib/setup.php @@ -40,11 +40,13 @@ class OC_Setup { $error[] = $l->t('Specify a data folder.'); } - if($dbtype=='mysql' or $dbtype == 'pgsql' or $dbtype == 'oci') { //mysql and postgresql needs more config options - if($dbtype=='mysql') + if($dbtype == 'mysql' or $dbtype == 'pgsql' or $dbtype == 'oci' or $dbtype == 'mssql') { //mysql and postgresql needs more config options + if($dbtype == 'mysql') $dbprettyname = 'MySQL'; - else if($dbtype=='pgsql') + else if($dbtype == 'pgsql') $dbprettyname = 'PostgreSQL'; + else if ($dbtype == 'mssql') + $dbprettyname = 'MS SQL Server'; else $dbprettyname = 'Oracle'; @@ -152,6 +154,29 @@ class OC_Setup { return $error; } } + elseif ($dbtype == 'mssql') { + $dbuser = $options['dbuser']; + $dbpass = $options['dbpass']; + $dbname = $options['dbname']; + $dbhost = $options['dbhost']; + $dbtableprefix = isset($options['dbtableprefix']) ? $options['dbtableprefix'] : 'oc_'; + + OC_Config::setValue('dbname', $dbname); + OC_Config::setValue('dbhost', $dbhost); + OC_Config::setValue('dbuser', $dbuser); + OC_Config::setValue('dbpassword', $dbpass); + OC_Config::setValue('dbtableprefix', $dbtableprefix); + + try { + self::setupMSSQLDatabase($dbhost, $dbuser, $dbpass, $dbname, $dbtableprefix); + } catch (Exception $e) { + $error[] = array( + 'error' => 'MS SQL username and/or password not valid', + 'hint' => 'You need to enter either an existing account or the administrator.' + ); + return $error; + } + } else { //delete the old sqlite database first, might cause infinte loops otherwise if(file_exists("$datadir/owncloud.db")) { @@ -256,11 +281,12 @@ class OC_Setup { if(!$result) { $entry = $l->t('DB Error: "%s"', array(mysql_error($connection))) . '
    '; $entry .= $l->t('Offending command was: "%s"', array($query)) . '
    '; - echo($entry); + \OC_Log::write('setup.mssql', $entry, \OC_Log::WARN); } $query="GRANT ALL PRIVILEGES ON `$name` . * TO '$user'"; - //this query will fail if there aren't the right permissons, ignore the error - $result = mysql_query($query, $connection); + + //this query will fail if there aren't the right permissions, ignore the error + mysql_query($query, $connection); } private static function createDBUser($name, $password, $connection) { @@ -359,7 +385,7 @@ class OC_Setup { if(!$result) { $entry = $l->t('DB Error: "%s"', array(pg_last_error($connection))) . '
    '; $entry .= $l->t('Offending command was: "%s"', array($query)) . '
    '; - echo($entry); + \OC_Log::write('setup.pg', $entry, \OC_Log::WARN); } if(! pg_fetch_row($result)) { //The database does not exists... let's create it @@ -368,11 +394,11 @@ class OC_Setup { if(!$result) { $entry = $l->t('DB Error: "%s"', array(pg_last_error($connection))) . '
    '; $entry .= $l->t('Offending command was: "%s"', array($query)) . '
    '; - echo($entry); + \OC_Log::write('setup.pg', $entry, \OC_Log::WARN); } else { $query = "REVOKE ALL PRIVILEGES ON DATABASE \"$e_name\" FROM PUBLIC"; - $result = pg_query($connection, $query); + pg_query($connection, $query); } } } @@ -386,7 +412,7 @@ class OC_Setup { if(!$result) { $entry = $l->t('DB Error: "%s"', array(pg_last_error($connection))) . '
    '; $entry .= $l->t('Offending command was: "%s"', array($query)) . '
    '; - echo($entry); + \OC_Log::write('setup.pg', $entry, \OC_Log::WARN); } if(! pg_fetch_row($result)) { @@ -396,7 +422,7 @@ class OC_Setup { if(!$result) { $entry = $l->t('DB Error: "%s"', array(pg_last_error($connection))) . '
    '; $entry .= $l->t('Offending command was: "%s"', array($query)) . '
    '; - echo($entry); + \OC_Log::write('setup.pg', $entry, \OC_Log::WARN); } } else { // change password of the existing role @@ -405,7 +431,7 @@ class OC_Setup { if(!$result) { $entry = $l->t('DB Error: "%s"', array(pg_last_error($connection))) . '
    '; $entry .= $l->t('Offending command was: "%s"', array($query)) . '
    '; - echo($entry); + \OC_Log::write('setup.pg', $entry, \OC_Log::WARN); } } } @@ -434,7 +460,7 @@ class OC_Setup { if (!$stmt) { $entry = $l->t('DB Error: "%s"', array(oci_last_error($connection))) . '
    '; $entry .= $l->t('Offending command was: "%s"', array($query)) . '
    '; - echo($entry); + \OC_Log::write('setup.oci', $entry, \OC_Log::WARN); } $result = oci_execute($stmt); if($result) { @@ -498,9 +524,9 @@ class OC_Setup { $un = $dbtableprefix.'users'; oci_bind_by_name($stmt, ':un', $un); if (!$stmt) { - $entry = $l->t('DB Error: "%s"', array(oci_last_error($connection))) . '
    '; + $entry = $l->t('DB Error: "%s"', array(oci_error($connection))) . '
    '; $entry .= $l->t('Offending command was: "%s"', array($query)) . '
    '; - echo($entry); + \OC_Log::write('setup.oci', $entry, \OC_Log::WARN); } $result = oci_execute($stmt); @@ -526,14 +552,14 @@ class OC_Setup { if (!$stmt) { $entry = $l->t('DB Error: "%s"', array(oci_error($connection))) . '
    '; $entry .= $l->t('Offending command was: "%s"', array($query)) . '
    '; - echo($entry); + \OC_Log::write('setup.oci', $entry, \OC_Log::WARN); } oci_bind_by_name($stmt, ':un', $name); $result = oci_execute($stmt); if(!$result) { $entry = $l->t('DB Error: "%s"', array(oci_error($connection))) . '
    '; $entry .= $l->t('Offending command was: "%s"', array($query)) . '
    '; - echo($entry); + \OC_Log::write('setup.oci', $entry, \OC_Log::WARN); } if(! oci_fetch_row($stmt)) { @@ -544,7 +570,7 @@ class OC_Setup { if (!$stmt) { $entry = $l->t('DB Error: "%s"', array(oci_error($connection))) . '
    '; $entry .= $l->t('Offending command was: "%s"', array($query)) . '
    '; - echo($entry); + \OC_Log::write('setup.oci', $entry, \OC_Log::WARN); } //oci_bind_by_name($stmt, ':un', $name); $result = oci_execute($stmt); @@ -552,7 +578,7 @@ class OC_Setup { $entry = $l->t('DB Error: "%s"', array(oci_error($connection))) . '
    '; $entry .= $l->t('Offending command was: "%s", name: %s, password: %s', array($query, $name, $password)) . '
    '; - echo($entry); + \OC_Log::write('setup.oci', $entry, \OC_Log::WARN); } } else { // change password of the existing role $query = "ALTER USER :un IDENTIFIED BY :pw"; @@ -560,7 +586,7 @@ class OC_Setup { if (!$stmt) { $entry = $l->t('DB Error: "%s"', array(oci_error($connection))) . '
    '; $entry .= $l->t('Offending command was: "%s"', array($query)) . '
    '; - echo($entry); + \OC_Log::write('setup.oci', $entry, \OC_Log::WARN); } oci_bind_by_name($stmt, ':un', $name); oci_bind_by_name($stmt, ':pw', $password); @@ -568,26 +594,200 @@ class OC_Setup { if(!$result) { $entry = $l->t('DB Error: "%s"', array(oci_error($connection))) . '
    '; $entry .= $l->t('Offending command was: "%s"', array($query)) . '
    '; - echo($entry); + \OC_Log::write('setup.oci', $entry, \OC_Log::WARN); } } - // grant neccessary roles + // grant necessary roles $query = 'GRANT CREATE SESSION, CREATE TABLE, CREATE SEQUENCE, CREATE TRIGGER, UNLIMITED TABLESPACE TO '.$name; $stmt = oci_parse($connection, $query); if (!$stmt) { $entry = $l->t('DB Error: "%s"', array(oci_error($connection))) . '
    '; $entry .= $l->t('Offending command was: "%s"', array($query)) . '
    '; - echo($entry); + \OC_Log::write('setup.oci', $entry, \OC_Log::WARN); } $result = oci_execute($stmt); if(!$result) { $entry = $l->t('DB Error: "%s"', array(oci_error($connection))) . '
    '; $entry .= $l->t('Offending command was: "%s", name: %s, password: %s', array($query, $name, $password)) . '
    '; - echo($entry); + \OC_Log::write('setup.oci', $entry, \OC_Log::WARN); } } + private static function setupMSSQLDatabase($dbhost, $dbuser, $dbpass, $dbname, $dbtableprefix) { + $l = self::getTrans(); + + //check if the database user has admin right + $masterConnectionInfo = array( "Database" => "master", "UID" => $dbuser, "PWD" => $dbpass); + + $masterConnection = @sqlsrv_connect($dbhost, $masterConnectionInfo); + if(!$masterConnection) { + $entry = null; + if( ($errors = sqlsrv_errors() ) != null) { + $entry='DB Error: "'.print_r(sqlsrv_errors()).'"
    '; + } else { + $entry = ''; + } + throw new Exception($l->t('MS SQL username and/or password not valid: $s', array($entry))); + } + + OC_Config::setValue('dbuser', $dbuser); + OC_Config::setValue('dbpassword', $dbpass); + + self::mssql_createDBLogin($dbuser, $dbpass, $masterConnection); + + self::mssql_createDatabase($dbname, $masterConnection); + + self::mssql_createDBUser($dbuser, $dbname, $masterConnection); + + sqlsrv_close($masterConnection); + + self::mssql_createDatabaseStructure($dbhost, $dbname, $dbuser, $dbpass, $dbtableprefix); + } + + private static function mssql_createDBLogin($name, $password, $connection) { + $query = "SELECT * FROM master.sys.server_principals WHERE name = '".$name."';"; + $result = sqlsrv_query($connection, $query); + if ($result === false) { + if ( ($errors = sqlsrv_errors() ) != null) { + $entry='DB Error: "'.print_r(sqlsrv_errors()).'"
    '; + } else { + $entry = ''; + } + $entry.='Offending command was: '.$query.'
    '; + \OC_Log::write('setup.mssql', $entry, \OC_Log::WARN); + } else { + $row = sqlsrv_fetch_array($result); + + if ($row === false) { + if ( ($errors = sqlsrv_errors() ) != null) { + $entry='DB Error: "'.print_r(sqlsrv_errors()).'"
    '; + } else { + $entry = ''; + } + $entry.='Offending command was: '.$query.'
    '; + \OC_Log::write('setup.mssql', $entry, \OC_Log::WARN); + } else { + if ($row == null) { + $query = "CREATE LOGIN [".$name."] WITH PASSWORD = '".$password."';"; + $result = sqlsrv_query($connection, $query); + if (!$result or $result === false) { + if ( ($errors = sqlsrv_errors() ) != null) { + $entry='DB Error: "'.print_r(sqlsrv_errors()).'"
    '; + } else { + $entry = ''; + } + $entry.='Offending command was: '.$query.'
    '; + \OC_Log::write('setup.mssql', $entry, \OC_Log::WARN); + } + } + } + } + } + + private static function mssql_createDBUser($name, $dbname, $connection) { + $query = "SELECT * FROM [".$dbname."].sys.database_principals WHERE name = '".$name."';"; + $result = sqlsrv_query($connection, $query); + if ($result === false) { + if ( ($errors = sqlsrv_errors() ) != null) { + $entry='DB Error: "'.print_r(sqlsrv_errors()).'"
    '; + } else { + $entry = ''; + } + $entry.='Offending command was: '.$query.'
    '; + \OC_Log::write('setup.mssql', $entry, \OC_Log::WARN); + } else { + $row = sqlsrv_fetch_array($result); + + if ($row === false) { + if ( ($errors = sqlsrv_errors() ) != null) { + $entry='DB Error: "'.print_r(sqlsrv_errors()).'"
    '; + } else { + $entry = ''; + } + $entry.='Offending command was: '.$query.'
    '; + \OC_Log::write('setup.mssql', $entry, \OC_Log::WARN); + } else { + if ($row == null) { + $query = "USE [".$dbname."]; CREATE USER [".$name."] FOR LOGIN [".$name."];"; + $result = sqlsrv_query($connection, $query); + if (!$result || $result === false) { + if ( ($errors = sqlsrv_errors() ) != null) { + $entry = 'DB Error: "'.print_r(sqlsrv_errors()).'"
    '; + } else { + $entry = ''; + } + $entry.='Offending command was: '.$query.'
    '; + \OC_Log::write('setup.mssql', $entry, \OC_Log::WARN); + } + } + + $query = "USE [".$dbname."]; EXEC sp_addrolemember 'db_owner', '".$name."';"; + $result = sqlsrv_query($connection, $query); + if (!$result || $result === false) { + if ( ($errors = sqlsrv_errors() ) != null) { + $entry='DB Error: "'.print_r(sqlsrv_errors()).'"
    '; + } else { + $entry = ''; + } + $entry.='Offending command was: '.$query.'
    '; + \OC_Log::write('setup.mssql', $entry, \OC_Log::WARN); + } + } + } + } + + private static function mssql_createDatabase($dbname, $connection) { + $query = "CREATE DATABASE [".$dbname."];"; + $result = sqlsrv_query($connection, $query); + if (!$result || $result === false) { + if ( ($errors = sqlsrv_errors() ) != null) { + $entry='DB Error: "'.print_r(sqlsrv_errors()).'"
    '; + } else { + $entry = ''; + } + $entry.='Offending command was: '.$query.'
    '; + \OC_Log::write('setup.mssql', $entry, \OC_Log::WARN); + } + } + + private static function mssql_createDatabaseStructure($dbhost, $dbname, $dbuser, $dbpass, $dbtableprefix) { + $connectionInfo = array( "Database" => $dbname, "UID" => $dbuser, "PWD" => $dbpass); + + $connection = @sqlsrv_connect($dbhost, $connectionInfo); + + //fill the database if needed + $query = "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '{$dbname}' AND TABLE_NAME = '{$dbtableprefix}users'"; + $result = sqlsrv_query($connection, $query); + if ($result === false) { + if ( ($errors = sqlsrv_errors() ) != null) { + $entry='DB Error: "'.print_r(sqlsrv_errors()).'"
    '; + } else { + $entry = ''; + } + $entry.='Offending command was: '.$query.'
    '; + \OC_Log::write('setup.mssql', $entry, \OC_Log::WARN); + } else { + $row = sqlsrv_fetch_array($result); + + if ($row === false) { + if ( ($errors = sqlsrv_errors() ) != null) { + $entry='DB Error: "'.print_r(sqlsrv_errors()).'"
    '; + } else { + $entry = ''; + } + $entry.='Offending command was: '.$query.'
    '; + \OC_Log::write('setup.mssql', $entry, \OC_Log::WARN); + } else { + if ($row == null) { + OC_DB::createDbFromStructure('db_structure.xml'); + } + } + } + + sqlsrv_close($connection); + } + /** * create .htaccess files for apache hosts */ diff --git a/lib/template.php b/lib/template.php index 3df5a24f94..ce55e58d28 100644 --- a/lib/template.php +++ b/lib/template.php @@ -413,11 +413,6 @@ class OC_Template{ if( $this->renderas ) { $page = new OC_TemplateLayout($this->renderas); - if($this->renderas == 'user') { - $page->assign('requesttoken', $this->vars['requesttoken']); - $user = OC_User::getUser(); - $page->assign('displayname', OCP\User::getDisplayName($user)); - } // Add custom headers $page->assign('headers', $this->headers, false); @@ -530,8 +525,10 @@ class OC_Template{ * @param string $hint An option hint message */ public static function printErrorPage( $error_msg, $hint = '' ) { + $content = new OC_Template( '', 'error', 'error' ); $errors = array(array('error' => $error_msg, 'hint' => $hint)); - OC_Template::printGuestPage("", "error", array("errors" => $errors)); + $content->assign( 'errors', $errors, false ); + $content->printPage(); die(); } } diff --git a/lib/templatelayout.php b/lib/templatelayout.php index 25d4033d9e..afa875b0a6 100644 --- a/lib/templatelayout.php +++ b/lib/templatelayout.php @@ -31,7 +31,7 @@ class OC_TemplateLayout extends OC_Template { } $user_displayname = OC_User::getDisplayName(); $this->assign( 'user_displayname', $user_displayname ); - } else if ($renderas == 'guest') { + } else if ($renderas == 'guest' || $renderas == 'error') { parent::__construct('core', 'layout.guest'); } else { parent::__construct('core', 'layout.base'); @@ -39,7 +39,7 @@ class OC_TemplateLayout extends OC_Template { // Add the js files $jsfiles = self::findJavascriptFiles(OC_Util::$scripts); $this->assign('jsfiles', array(), false); - if (OC_Config::getValue('installed', false)) { + if (OC_Config::getValue('installed', false) && $renderas!='error') { $this->append( 'jsfiles', OC_Helper::linkToRoute('js_config')); } if (!empty(OC_Util::$core_scripts)) { diff --git a/lib/util.php b/lib/util.php index 87facda180..cfb13ad292 100755 --- a/lib/util.php +++ b/lib/util.php @@ -75,7 +75,7 @@ class OC_Util { public static function getVersion() { // hint: We only can count up. Reset minor/patchlevel when // updating major/minor version number. - return array(4, 93, 10); + return array(4, 94, 10); } /** @@ -83,7 +83,7 @@ class OC_Util { * @return string */ public static function getVersionString() { - return '5.0 beta 1'; + return '5.0 beta 2'; } /** @@ -275,19 +275,6 @@ class OC_Util { $web_server_restart= false; } - $handler = ini_get("session.save_handler"); - if($handler == "files") { - $tmpDir = session_save_path(); - if($tmpDir != "") { - if(!@is_writable($tmpDir)) { - $errors[]=array('error' => 'The temporary folder used by PHP to save the session data' - .' is either incorrect or not writable! Please check : '.session_save_path().'
    ', - 'hint'=>'Please ask your server administrator to grant write access' - .' or define another temporary folder.'); - } - } - } - if($web_server_restart) { $errors[]=array('error'=>'PHP modules have been installed, but they are still listed as missing?
    ', 'hint'=>'Please ask your server administrator to restart the web server.'); @@ -509,10 +496,10 @@ class OC_Util { * @return array with sanitized strings or a single sanitized string, depends on the input parameter. */ public static function sanitizeHTML( &$value ) { - if (is_array($value) || is_object($value)) { + if (is_array($value)) { array_walk_recursive($value, 'OC_Util::sanitizeHTML'); } else { - $value = htmlentities($value, ENT_QUOTES, 'UTF-8'); //Specify encoding for PHP<5.4 + $value = htmlentities((string)$value, ENT_QUOTES, 'UTF-8'); //Specify encoding for PHP<5.4 } return $value; } @@ -569,11 +556,16 @@ class OC_Util { if (!function_exists('curl_init')) { return true; } - $settings = array( 'baseUri' => OC_Helper::linkToRemote('webdav'), ); + // save the old timeout so that we can restore it later + $old_timeout=ini_get("default_socket_timeout"); + + // use a 5 sec timeout for the check. Should be enough for local requests. + ini_set("default_socket_timeout", 5); + $client = new \Sabre_DAV_Client($settings); $return = true; @@ -587,6 +579,9 @@ class OC_Util { $return = false; } + // restore the original timeout + ini_set("default_socket_timeout", $old_timeout); + return $return; } diff --git a/search/js/result.js b/search/js/result.js index cadb0d0aab..78fa8efc8e 100644 --- a/search/js/result.js +++ b/search/js/result.js @@ -28,7 +28,7 @@ OC.search.showResults=function(results){ OC.search.hide(); event.stopPropagation(); }); - $(window).click(function(event){ + $(document).click(function(event){ OC.search.hide(); }); OC.search.lastResults=results; diff --git a/settings/js/personal.js b/settings/js/personal.js index 4c8b2542b5..d0a471e56b 100644 --- a/settings/js/personal.js +++ b/settings/js/personal.js @@ -42,9 +42,9 @@ $(document).ready(function(){ $.post( 'ajax/changedisplayname.php', post, function(data){ if( data.status == "success" ){ $('#displaynamechanged').show(); - $('#oldDisplayName').val($('#displayName').val()); + $('#oldDisplayName').text($('#displayName').val()); // update displayName on the top right expand button - $('#expandDisplayName').html($('#displayName').val()); + $('#expandDisplayName').text($('#displayName').val()); } else{ $('#newdisplayname').val(data.data.displayName) diff --git a/settings/l10n/he.php b/settings/l10n/he.php index 20e97b3ffd..196dc4d146 100644 --- a/settings/l10n/he.php +++ b/settings/l10n/he.php @@ -39,6 +39,7 @@ "Forum" => "פורום", "Commercial Support" => "תמיכה בתשלום", "You have used %s of the available %s" => "השתמשת ב־%s מתוך %s הזמינים לך", +"Get the apps to sync your files" => "השג את האפליקציות על מנת לסנכרן את הקבצים שלך", "Password" => "ססמה", "Your password was changed" => "הססמה שלך הוחלפה", "Unable to change your password" => "לא ניתן לשנות את הססמה שלך", diff --git a/settings/l10n/my_MM.php b/settings/l10n/my_MM.php index de234d9643..a332c4d8ce 100644 --- a/settings/l10n/my_MM.php +++ b/settings/l10n/my_MM.php @@ -1,3 +1,6 @@ "ခွင့်ပြုချက်မအောင်မြင်" +"Authentication error" => "ခွင့်ပြုချက်မအောင်မြင်", +"Security Warning" => "လုံခြုံရေးသတိပေးချက်", +"Password" => "စကားဝှက်", +"New password" => "စကားဝှက်အသစ်" ); diff --git a/tests/lib/app.php b/tests/lib/app.php new file mode 100644 index 0000000000..9cab36903a --- /dev/null +++ b/tests/lib/app.php @@ -0,0 +1,66 @@ + + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +class Test_App extends PHPUnit_Framework_TestCase { + + + public function testIsAppVersionCompatibleSingleOCNumber(){ + $oc = array(4); + $app = '4.0'; + + $this->assertTrue(OC_App::isAppVersionCompatible($oc, $app)); + } + + + public function testIsAppVersionCompatibleMultipleOCNumber(){ + $oc = array(4, 3, 1); + $app = '4.3'; + + $this->assertTrue(OC_App::isAppVersionCompatible($oc, $app)); + } + + + public function testIsAppVersionCompatibleSingleNumber(){ + $oc = array(4); + $app = '4'; + + $this->assertTrue(OC_App::isAppVersionCompatible($oc, $app)); + } + + + public function testIsAppVersionCompatibleSingleAppNumber(){ + $oc = array(4, 3); + $app = '4'; + + $this->assertTrue(OC_App::isAppVersionCompatible($oc, $app)); + } + + + public function testIsAppVersionCompatibleShouldFail(){ + $oc = array(4, 3, 1); + $app = '4.3.2'; + + $this->assertFalse(OC_App::isAppVersionCompatible($oc, $app)); + } + + public function testIsAppVersionCompatibleShouldFailTwoVersionNumbers(){ + $oc = array(4, 3, 1); + $app = '4.4'; + + $this->assertFalse(OC_App::isAppVersionCompatible($oc, $app)); + } + + + public function testIsAppVersionCompatibleShouldFailOneVersionNumbers(){ + $oc = array(4, 3, 1); + $app = '5'; + + $this->assertFalse(OC_App::isAppVersionCompatible($oc, $app)); + } + +} \ No newline at end of file diff --git a/tests/lib/dbschema.php b/tests/lib/dbschema.php index fb60ce7dbb..e20a04ef7f 100644 --- a/tests/lib/dbschema.php +++ b/tests/lib/dbschema.php @@ -91,9 +91,15 @@ class Test_DBSchema extends PHPUnit_Framework_TestCase { break; case 'pgsql': $sql = "SELECT tablename AS table_name, schemaname AS schema_name " - . "FROM pg_tables WHERE schemaname NOT LIKE 'pg_%' " - . "AND schemaname != 'information_schema' " - . "AND tablename = '".$table."'"; + . "FROM pg_tables WHERE schemaname NOT LIKE 'pg_%' " + . "AND schemaname != 'information_schema' " + . "AND tablename = '".$table."'"; + $query = OC_DB::prepare($sql); + $result = $query->execute(array()); + $exists = $result && $result->fetchOne(); + break; + case 'mssql': + $sql = "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = '{$table}'"; $query = OC_DB::prepare($sql); $result = $query->execute(array()); $exists = $result && $result->fetchOne();