diff options
Diffstat (limited to 'apps')
137 files changed, 1028 insertions, 480 deletions
diff --git a/apps/files/ajax/getstoragestats.php b/apps/files/ajax/getstoragestats.php index 32a77bff6c3..dd7c7dc5571 100644 --- a/apps/files/ajax/getstoragestats.php +++ b/apps/files/ajax/getstoragestats.php @@ -3,7 +3,13 @@ // only need filesystem apps $RUNTIME_APPTYPES = array('filesystem'); +$dir = '/'; + +if (isset($_GET['dir'])) { + $dir = $_GET['dir']; +} + OCP\JSON::checkLoggedIn(); // send back json -OCP\JSON::success(array('data' => \OCA\Files\Helper::buildFileStorageStatistics('/'))); +OCP\JSON::success(array('data' => \OCA\Files\Helper::buildFileStorageStatistics($dir))); diff --git a/apps/files/ajax/list.php b/apps/files/ajax/list.php index 350fc7fa5f6..0be38c3b96f 100644 --- a/apps/files/ajax/list.php +++ b/apps/files/ajax/list.php @@ -10,7 +10,7 @@ OCP\JSON::checkLoggedIn(); // Load the files $dir = isset( $_GET['dir'] ) ? $_GET['dir'] : ''; - +$dir = \OC\Files\Filesystem::normalizePath($dir); if (!\OC\Files\Filesystem::is_dir($dir . '/')) { header("HTTP/1.0 404 Not Found"); exit(); diff --git a/apps/files/ajax/newfile.php b/apps/files/ajax/newfile.php index eed0047fc81..c327d2b9f94 100644 --- a/apps/files/ajax/newfile.php +++ b/apps/files/ajax/newfile.php @@ -89,7 +89,7 @@ if($source) { $meta = \OC\Files\Filesystem::getFileInfo($target); $mime=$meta['mimetype']; $id = $meta['fileid']; - $eventSource->send('success', array('mime'=>$mime, 'size'=>\OC\Files\Filesystem::filesize($target), 'id' => $id)); + $eventSource->send('success', array('mime'=>$mime, 'size'=>\OC\Files\Filesystem::filesize($target), 'id' => $id, 'etag' => $meta['etag'])); } else { $eventSource->send('error', $l10n->t('Error while downloading %s to %s', array($source, $target))); } @@ -119,6 +119,7 @@ if($source) { 'mime' => $mime, 'size' => $size, 'content' => $content, + 'etag' => $meta['etag'], ))); exit(); } diff --git a/apps/files/ajax/upload.php b/apps/files/ajax/upload.php index 38c2a053a9e..0e905f993ac 100644 --- a/apps/files/ajax/upload.php +++ b/apps/files/ajax/upload.php @@ -132,6 +132,7 @@ if (strpos($dir, '..') === false) { 'size' => $meta['size'], 'id' => $meta['fileid'], 'name' => basename($target), + 'etag' => $meta['etag'], 'originalname' => $files['tmp_name'][$i], 'uploadMaxFilesize' => $maxUploadFileSize, 'maxHumanFilesize' => $maxHumanFileSize, @@ -158,6 +159,7 @@ if (strpos($dir, '..') === false) { 'size' => $meta['size'], 'id' => $meta['fileid'], 'name' => basename($target), + 'etag' => $meta['etag'], 'originalname' => $files['tmp_name'][$i], 'uploadMaxFilesize' => $maxUploadFileSize, 'maxHumanFilesize' => $maxHumanFileSize, diff --git a/apps/files/css/files.css b/apps/files/css/files.css index af8597192f3..b9bf8cb87c1 100644 --- a/apps/files/css/files.css +++ b/apps/files/css/files.css @@ -320,8 +320,9 @@ table.dragshadow { width:auto; } table.dragshadow td.filename { - padding-left:36px; + padding-left:60px; padding-right:16px; + height: 36px; } table.dragshadow td.size { padding-right:8px; diff --git a/apps/files/index.php b/apps/files/index.php index f0f95b3bac8..9ae378d7a1d 100644 --- a/apps/files/index.php +++ b/apps/files/index.php @@ -36,6 +36,7 @@ OCP\Util::addscript('files', 'filelist'); OCP\App::setActiveNavigationEntry('files_index'); // Load the files $dir = isset($_GET['dir']) ? stripslashes($_GET['dir']) : ''; +$dir = \OC\Files\Filesystem::normalizePath($dir); // Redirect if directory does not exist if (!\OC\Files\Filesystem::is_dir($dir . '/')) { header('Location: ' . OCP\Util::getScriptName() . ''); @@ -128,7 +129,7 @@ if ($needUpgrade) { $tmpl = new OCP\Template('files', 'index', 'user'); $tmpl->assign('fileList', $list->fetchPage()); $tmpl->assign('breadcrumb', $breadcrumbNav->fetchPage()); - $tmpl->assign('dir', \OC\Files\Filesystem::normalizePath($dir)); + $tmpl->assign('dir', $dir); $tmpl->assign('isCreatable', $isCreatable); $tmpl->assign('permissions', $permissions); $tmpl->assign('files', $files); diff --git a/apps/files/js/file-upload.js b/apps/files/js/file-upload.js index 8c56f1cb364..bc1244a1e6e 100644 --- a/apps/files/js/file-upload.js +++ b/apps/files/js/file-upload.js @@ -303,16 +303,15 @@ $(document).ready(function() { OC.Upload.log('fail', e, data); if (typeof data.textStatus !== 'undefined' && data.textStatus !== 'success' ) { if (data.textStatus === 'abort') { - $('#notification').text(t('files', 'Upload cancelled.')); + OC.Notification.show(t('files', 'Upload cancelled.')); } else { // HTTP connection problem - $('#notification').text(data.errorThrown); + OC.Notification.show(data.errorThrown); } - $('#notification').fadeIn(); - //hide notification after 5 sec + //hide notification after 10 sec setTimeout(function() { - $('#notification').fadeOut(); - }, 5000); + OC.Notification.hide(); + }, 10000); } OC.Upload.deleteUpload(data); }, @@ -404,7 +403,7 @@ $(document).ready(function() { $('#uploadprogresswrapper input.stop').fadeOut(); $('#uploadprogressbar').fadeOut(); - + Files.updateStorageStatistics(); }); fileupload.on('fileuploadfail', function(e, data) { OC.Upload.log('progress handle fileuploadfail', e, data); @@ -575,11 +574,12 @@ $(document).ready(function() { tr.attr('data-size', result.data.size); tr.attr('data-mime', result.data.mime); tr.attr('data-id', result.data.id); + tr.attr('data-etag', result.data.etag); tr.find('.filesize').text(humanFileSize(result.data.size)); var path = getPathForPreview(name); - lazyLoadPreview(path, result.data.mime, function(previewpath) { + Files.lazyLoadPreview(path, result.data.mime, function(previewpath) { tr.find('td.filename').attr('style','background-image:url('+previewpath+')'); - }); + }, null, null, result.data.etag); FileActions.display(tr.find('td.filename'), true); } else { OC.dialogs.alert(result.data.message, t('core', 'Could not create file')); @@ -641,9 +641,9 @@ $(document).ready(function() { tr.data('mime', mime).data('id', id); tr.attr('data-id', id); var path = $('#dir').val()+'/'+localName; - lazyLoadPreview(path, mime, function(previewpath) { + Files.lazyLoadPreview(path, mime, function(previewpath) { tr.find('td.filename').attr('style', 'background-image:url('+previewpath+')'); - }); + }, null, null, data.etag); FileActions.display(tr.find('td.filename'), true); }); eventSource.listen('error',function(error) { diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js index e935ce7d5d3..49dd28517be 100644 --- a/apps/files/js/filelist.js +++ b/apps/files/js/filelist.js @@ -152,6 +152,9 @@ var FileList={ FileActions.display(tr.find('td.filename'), true); return tr; }, + getCurrentDirectory: function(){ + return $('#dir').val() || '/'; + }, /** * @brief Changes the current directory and reload the file list. * @param targetDir target directory (non URL encoded) @@ -167,6 +170,12 @@ var FileList={ return; } FileList.setCurrentDir(targetDir, changeUrl); + $('#fileList').trigger( + jQuery.Event('changeDirectory', { + dir: targetDir, + previousDir: currentDir + } + )); FileList.reload(); }, linkTo: function(dir) { @@ -224,6 +233,10 @@ var FileList={ return; } + // TODO: should rather return upload file size through + // the files list ajax call + Files.updateStorageStatistics(true); + if (result.data.permissions) { FileList.setDirectoryPermissions(result.data.permissions); } @@ -329,9 +342,9 @@ var FileList={ tr.attr('data-id', id); } var path = getPathForPreview(name); - lazyLoadPreview(path, mime, function(previewpath) { + Files.lazyLoadPreview(path, mime, function(previewpath) { tr.find('td.filename').attr('style','background-image:url('+previewpath+')'); - }); + }, null, null, tr.attr('data-etag')); tr.find('td.filename').draggable(dragOptions); }, isLoading:function(name) { @@ -554,6 +567,7 @@ var FileList={ checkTrashStatus(); FileList.updateFileSummary(); FileList.updateEmptyContent(); + Files.updateStorageStatistics(); } else { $.each(files,function(index,file) { var deleteAction = $('tr[data-file="'+files[i]+'"]').children("td.date").children(".action.delete"); @@ -563,24 +577,12 @@ var FileList={ }); }, createFileSummary: function() { - if ( $('#fileList tr').exists() ) { - var totalDirs = 0; - var totalFiles = 0; - var totalSize = 0; - - // Count types and filesize - $.each($('tr[data-file]'), function(index, value) { - if ($(value).data('type') === 'dir') { - totalDirs++; - } else if ($(value).data('type') === 'file') { - totalFiles++; - } - totalSize += parseInt($(value).data('size')); - }); + if( $('#fileList tr').exists() ) { + var summary = this._calculateFileSummary(); // Get translations - var directoryInfo = n('files', '%n folder', '%n folders', totalDirs); - var fileInfo = n('files', '%n file', '%n files', totalFiles); + var directoryInfo = n('files', '%n folder', '%n folders', summary.totalDirs); + var fileInfo = n('files', '%n file', '%n files', summary.totalFiles); var infoVars = { dirs: '<span class="dirinfo">'+directoryInfo+'</span><span class="connector">', @@ -590,10 +592,10 @@ var FileList={ var info = t('files', '{dirs} and {files}', infoVars); // don't show the filesize column, if filesize is NaN (e.g. in trashbin) - if (isNaN(totalSize)) { + if (isNaN(summary.totalSize)) { var fileSize = ''; } else { - var fileSize = '<td class="filesize">'+humanFileSize(totalSize)+'</td>'; + var fileSize = '<td class="filesize">'+humanFileSize(summary.totalSize)+'</td>'; } var $summary = $('<tr class="summary"><td><span class="info">'+info+'</span></td>'+fileSize+'<td></td></tr>'); @@ -604,16 +606,36 @@ var FileList={ var $connector = $summary.find('.connector'); // Show only what's necessary, e.g.: no files: don't show "0 files" - if (totalDirs === 0) { + if (summary.totalDirs === 0) { $dirInfo.hide(); $connector.hide(); } - if (totalFiles === 0) { + if (summary.totalFiles === 0) { $fileInfo.hide(); $connector.hide(); } } }, + _calculateFileSummary: function() { + var result = { + totalDirs: 0, + totalFiles: 0, + totalSize: 0 + }; + $.each($('tr[data-file]'), function(index, value) { + var $value = $(value); + if ($value.data('type') === 'dir') { + result.totalDirs++; + } else if ($value.data('type') === 'file') { + result.totalFiles++; + } + if ($value.data('size') !== undefined && $value.data('id') !== -1) { + //Skip shared as it does not count toward quota + result.totalSize += parseInt($value.data('size')); + } + }); + return result; + }, updateFileSummary: function() { var $summary = $('.summary'); @@ -627,43 +649,30 @@ var FileList={ } // There's a summary and data -> Update the summary else if ($('#fileList tr').length > 1 && $summary.length === 1) { - var totalDirs = 0; - var totalFiles = 0; - var totalSize = 0; - $.each($('tr[data-file]'), function(index, value) { - if ($(value).data('type') === 'dir') { - totalDirs++; - } else if ($(value).data('type') === 'file') { - totalFiles++; - } - if ($(value).data('size') !== undefined) { - totalSize += parseInt($(value).data('size')); - } - }); - + var fileSummary = this._calculateFileSummary(); var $dirInfo = $('.summary .dirinfo'); var $fileInfo = $('.summary .fileinfo'); var $connector = $('.summary .connector'); // Substitute old content with new translations - $dirInfo.html(n('files', '%n folder', '%n folders', totalDirs)); - $fileInfo.html(n('files', '%n file', '%n files', totalFiles)); - $('.summary .filesize').html(humanFileSize(totalSize)); + $dirInfo.html(n('files', '%n folder', '%n folders', fileSummary.totalDirs)); + $fileInfo.html(n('files', '%n file', '%n files', fileSummary.totalFiles)); + $('.summary .filesize').html(humanFileSize(fileSummary.totalSize)); // Show only what's necessary (may be hidden) - if ($dirInfo.html().charAt(0) === "0") { + if (fileSummary.totalDirs === 0) { $dirInfo.hide(); $connector.hide(); } else { $dirInfo.show(); } - if ($fileInfo.html().charAt(0) === "0") { + if (fileSummary.totalFiles === 0) { $fileInfo.hide(); $connector.hide(); } else { $fileInfo.show(); } - if ($dirInfo.html().charAt(0) !== "0" && $fileInfo.html().charAt(0) !== "0") { + if (fileSummary.totalDirs > 0 && fileSummary.totalFiles > 0) { $connector.show(); } } @@ -867,7 +876,7 @@ $(document).ready(function() { data.context = FileList.addFile(file.name, file.size, date, false, false, param); // update file data - data.context.attr('data-mime',file.mime).attr('data-id',file.id); + data.context.attr('data-mime',file.mime).attr('data-id',file.id).attr('data-etag', file.etag); var permissions = data.context.data('permissions'); if (permissions !== file.permissions) { @@ -877,9 +886,9 @@ $(document).ready(function() { FileActions.display(data.context.find('td.filename'), true); var path = getPathForPreview(file.name); - lazyLoadPreview(path, file.mime, function(previewpath) { + Files.lazyLoadPreview(path, file.mime, function(previewpath) { data.context.find('td.filename').attr('style','background-image:url('+previewpath+')'); - }); + }, null, null, file.etag); } } }); diff --git a/apps/files/js/files.js b/apps/files/js/files.js index 0b10fa8c63a..fdaa3aa3342 100644 --- a/apps/files/js/files.js +++ b/apps/files/js/files.js @@ -1,4 +1,40 @@ Files={ + // file space size sync + _updateStorageStatistics: function() { + Files._updateStorageStatisticsTimeout = null; + var currentDir = FileList.getCurrentDirectory(), + state = Files.updateStorageStatistics; + if (state.dir){ + if (state.dir === currentDir) { + return; + } + // cancel previous call, as it was for another dir + state.call.abort(); + } + state.dir = currentDir; + state.call = $.getJSON(OC.filePath('files','ajax','getstoragestats.php') + '?dir=' + encodeURIComponent(currentDir),function(response) { + state.dir = null; + state.call = null; + Files.updateMaxUploadFilesize(response); + }); + }, + updateStorageStatistics: function(force) { + if (!OC.currentUser) { + return; + } + + // debounce to prevent calling too often + if (Files._updateStorageStatisticsTimeout) { + clearTimeout(Files._updateStorageStatisticsTimeout); + } + if (force) { + Files._updateStorageStatistics(); + } + else { + Files._updateStorageStatisticsTimeout = setTimeout(Files._updateStorageStatistics, 250); + } + }, + updateMaxUploadFilesize:function(response) { if (response === undefined) { return; @@ -20,6 +56,17 @@ Files={ } }, + + /** + * Fix path name by removing double slash at the beginning, if any + */ + fixPath: function(fileName) { + if (fileName.substr(0, 2) == '//') { + return fileName.substr(1); + } + return fileName; + }, + isFileNameValid:function (name) { if (name === '.') { throw t('files', '\'.\' is an invalid file name.'); @@ -340,30 +387,26 @@ $(document).ready(function() { setTimeout ( "Files.displayStorageWarnings()", 100 ); OC.Notification.setDefault(Files.displayStorageWarnings); - // file space size sync - function update_storage_statistics() { - $.getJSON(OC.filePath('files','ajax','getstoragestats.php'),function(response) { - Files.updateMaxUploadFilesize(response); - }); - } - - // start on load - we ask the server every 5 minutes - var update_storage_statistics_interval = 5*60*1000; - var update_storage_statistics_interval_id = setInterval(update_storage_statistics, update_storage_statistics_interval); - - // Use jquery-visibility to de-/re-activate file stats sync - if ($.support.pageVisibility) { - $(document).on({ - 'show.visibility': function() { - if (!update_storage_statistics_interval_id) { - update_storage_statistics_interval_id = setInterval(update_storage_statistics, update_storage_statistics_interval); + // only possible at the moment if user is logged in + if (OC.currentUser) { + // start on load - we ask the server every 5 minutes + var updateStorageStatisticsInterval = 5*60*1000; + var updateStorageStatisticsIntervalId = setInterval(Files.updateStorageStatistics, updateStorageStatisticsInterval); + + // Use jquery-visibility to de-/re-activate file stats sync + if ($.support.pageVisibility) { + $(document).on({ + 'show.visibility': function() { + if (!updateStorageStatisticsIntervalId) { + updateStorageStatisticsIntervalId = setInterval(Files.updateStorageStatistics, updateStorageStatisticsInterval); + } + }, + 'hide.visibility': function() { + clearInterval(updateStorageStatisticsIntervalId); + updateStorageStatisticsIntervalId = 0; } - }, - 'hide.visibility': function() { - clearInterval(update_storage_statistics_interval_id); - update_storage_statistics_interval_id = 0; - } - }); + }); + } } //scroll to and highlight preselected file @@ -404,6 +447,7 @@ function scanFiles(force, dir, users) { scannerEventSource.listen('done',function(count) { scanFiles.scanning=false; console.log('done after ' + count + ' files'); + Files.updateStorageStatistics(); }); scannerEventSource.listen('user',function(user) { console.log('scanning files for ' + user); @@ -457,9 +501,9 @@ var createDragShadow = function(event) { newtr.find('td.filename').attr('style','background-image:url('+OC.imagePath('core', 'filetypes/folder.png')+')'); } else { var path = getPathForPreview(elem.name); - lazyLoadPreview(path, elem.mime, function(previewpath) { + Files.lazyLoadPreview(path, elem.mime, function(previewpath) { newtr.find('td.filename').attr('style','background-image:url('+previewpath+')'); - }); + }, null, null, elem.etag); } }); @@ -469,7 +513,7 @@ var createDragShadow = function(event) { //options for file drag/drop var dragOptions={ revert: 'invalid', revertDuration: 300, - opacity: 0.7, zIndex: 100, appendTo: 'body', cursorAt: { left: -5, top: -5 }, + opacity: 0.7, zIndex: 100, appendTo: 'body', cursorAt: { left: 24, top: 18 }, helper: createDragShadow, cursor: 'move', stop: function(event, ui) { $('#fileList tr td.filename').addClass('ui-draggable'); @@ -592,7 +636,7 @@ function procesSelection() { if (selectedFiles.length>0) { selection += n('files', '%n file', '%n files', selectedFiles.length); } - $('#headerName>span.name').text(selection); + $('#headerName span.name').text(selection); $('#modified').text(''); $('table').addClass('multiselect'); } @@ -615,7 +659,8 @@ function getSelectedFilesTrash(property) { name:$(element).attr('data-file'), mime:$(element).data('mime'), type:$(element).data('type'), - size:$(element).data('size') + size:$(element).data('size'), + etag:$(element).data('etag') }; if (property) { files.push(file[property]); @@ -626,26 +671,28 @@ function getSelectedFilesTrash(property) { return files; } -function getMimeIcon(mime, ready) { - if (getMimeIcon.cache[mime]) { - ready(getMimeIcon.cache[mime]); +Files.getMimeIcon = function(mime, ready) { + if (Files.getMimeIcon.cache[mime]) { + ready(Files.getMimeIcon.cache[mime]); } else { $.get( OC.filePath('files','ajax','mimeicon.php'), {mime: mime}, function(path) { - getMimeIcon.cache[mime]=path; - ready(getMimeIcon.cache[mime]); + Files.getMimeIcon.cache[mime]=path; + ready(Files.getMimeIcon.cache[mime]); }); } } -getMimeIcon.cache={}; +Files.getMimeIcon.cache={}; function getPathForPreview(name) { var path = $('#dir').val() + '/' + name; return path; } -function lazyLoadPreview(path, mime, ready, width, height) { +Files.lazyLoadPreview = function(path, mime, ready, width, height, etag) { // get mime icon url - getMimeIcon(mime, function(iconURL) { + Files.getMimeIcon(mime, function(iconURL) { + var urlSpec = {}; + var previewURL; ready(iconURL); // set mimeicon URL // now try getting a preview thumbnail URL @@ -655,25 +702,38 @@ function lazyLoadPreview(path, mime, ready, width, height) { if ( ! height ) { height = $('#filestable').data('preview-y'); } + // note: the order of arguments must match the one + // from the server's template so that the browser + // knows it's the same file for caching + urlSpec.x = width; + urlSpec.y = height; + urlSpec.file = Files.fixPath(path); + + if (etag){ + // use etag as cache buster + urlSpec.c = etag; + } + else { + console.warn('Files.lazyLoadPreview(): missing etag argument'); + } + if ( $('#publicUploadButtonMock').length ) { - var previewURL = OC.Router.generate('core_ajax_public_preview', {file: path, x:width, y:height, t:$('#dirToken').val()}); + urlSpec.t = $('#dirToken').val(); + previewURL = OC.Router.generate('core_ajax_public_preview', urlSpec); } else { - var previewURL = OC.Router.generate('core_ajax_preview', {file: path, x:width, y:height}); - } - $.get(previewURL, function() { - previewURL = previewURL.replace('(', '%28'); - previewURL = previewURL.replace(')', '%29'); - previewURL += '&reload=true'; - - // preload image to prevent delay - // this will make the browser cache the image - var img = new Image(); - img.onload = function(){ - //set preview thumbnail URL - ready(previewURL); - } - img.src = previewURL; - }); + previewURL = OC.Router.generate('core_ajax_preview', urlSpec); + } + previewURL = previewURL.replace('(', '%28'); + previewURL = previewURL.replace(')', '%29'); + + // preload image to prevent delay + // this will make the browser cache the image + var img = new Image(); + img.onload = function(){ + //set preview thumbnail URL + ready(previewURL); + } + img.src = previewURL; }); } diff --git a/apps/files/l10n/ca.php b/apps/files/l10n/ca.php index 829213e046a..25938740baf 100644 --- a/apps/files/l10n/ca.php +++ b/apps/files/l10n/ca.php @@ -60,6 +60,7 @@ $TRANSLATIONS = array( "Name" => "Nom", "Size" => "Mida", "Modified" => "Modificat", +"Invalid folder name. Usage of 'Shared' is reserved." => "Nom de carpeta no vàlid. L'ús de 'Shared' és reservat", "%s could not be renamed" => "%s no es pot canviar el nom", "Upload" => "Puja", "File handling" => "Gestió de fitxers", diff --git a/apps/files/l10n/de.php b/apps/files/l10n/de.php index 646a32761b7..725b69c5cb2 100644 --- a/apps/files/l10n/de.php +++ b/apps/files/l10n/de.php @@ -60,6 +60,7 @@ $TRANSLATIONS = array( "Name" => "Name", "Size" => "Größe", "Modified" => "Geändert", +"Invalid folder name. Usage of 'Shared' is reserved." => "Ungültiger Verzeichnisname. Die Nutzung von 'Shared' ist reserviert.", "%s could not be renamed" => "%s konnte nicht umbenannt werden", "Upload" => "Hochladen", "File handling" => "Dateibehandlung", diff --git a/apps/files/l10n/de_DE.php b/apps/files/l10n/de_DE.php index 9bed97be33b..ebfe0084575 100644 --- a/apps/files/l10n/de_DE.php +++ b/apps/files/l10n/de_DE.php @@ -60,6 +60,7 @@ $TRANSLATIONS = array( "Name" => "Name", "Size" => "Größe", "Modified" => "Geändert", +"Invalid folder name. Usage of 'Shared' is reserved." => "Ungültiger Verzeichnisname. Die Nutzung von 'Shared' ist reserviert.", "%s could not be renamed" => "%s konnte nicht umbenannt werden", "Upload" => "Hochladen", "File handling" => "Dateibehandlung", diff --git a/apps/files/l10n/en_GB.php b/apps/files/l10n/en_GB.php index befa5e1a659..454d623a4d7 100644 --- a/apps/files/l10n/en_GB.php +++ b/apps/files/l10n/en_GB.php @@ -60,6 +60,7 @@ $TRANSLATIONS = array( "Name" => "Name", "Size" => "Size", "Modified" => "Modified", +"Invalid folder name. Usage of 'Shared' is reserved." => "Invalid folder name. Usage of 'Shared' is reserved.", "%s could not be renamed" => "%s could not be renamed", "Upload" => "Upload", "File handling" => "File handling", diff --git a/apps/files/l10n/eo.php b/apps/files/l10n/eo.php index 324da83de59..5063689f370 100644 --- a/apps/files/l10n/eo.php +++ b/apps/files/l10n/eo.php @@ -3,6 +3,14 @@ $TRANSLATIONS = array( "Could not move %s - File with this name already exists" => "Ne eblis movi %s: dosiero kun ĉi tiu nomo jam ekzistas", "Could not move %s" => "Ne eblis movi %s", "File name cannot be empty." => "Dosiernomo devas ne malpleni.", +"File name must not contain \"/\". Please choose a different name." => "La dosieronomo ne devas enhavi “/”. Bonvolu elekti malsaman nomon.", +"The name %s is already used in the folder %s. Please choose a different name." => "La nomo %s jam uziĝas en la dosierujo %s. Bonvolu elekti malsaman nomon.", +"Not a valid source" => "Nevalida fonto", +"Error while downloading %s to %s" => "Eraris elŝuto de %s al %s", +"Error when creating the file" => "Eraris la kreo de la dosiero", +"Folder name cannot be empty." => "La dosierujnomo ne povas malpleni.", +"Folder name must not contain \"/\". Please choose a different name." => "La dosiernomo ne devas enhavi “/”. Bonvolu elekti malsaman nomon.", +"Error when creating the folder" => "Eraris la kreo de la dosierujo", "Unable to set upload directory." => "Ne povis agordiĝi la alŝuta dosierujo.", "No file was uploaded. Unknown error" => "Neniu dosiero alŝutiĝis. Nekonata eraro.", "There is no error, the file uploaded with success" => "Ne estas eraro, la dosiero alŝutiĝis sukcese.", @@ -13,10 +21,14 @@ $TRANSLATIONS = array( "Missing a temporary folder" => "Mankas provizora dosierujo.", "Failed to write to disk" => "Malsukcesis skribo al disko", "Not enough storage available" => "Ne haveblas sufiĉa memoro", +"Upload failed. Could not get file info." => "La alŝuto malsukcesis. Ne povis ekhaviĝi informo pri dosiero.", +"Upload failed. Could not find uploaded file" => "La alŝuto malsukcesis. Ne troviĝis alŝutota dosiero.", "Invalid directory." => "Nevalida dosierujo.", "Files" => "Dosieroj", +"Unable to upload {filename} as it is a directory or has 0 bytes" => "Ne povis alŝutiĝi {filename} ĉar ĝi estas dosierujo aŭ ĝi havas 0 duumokojn", "Not enough space available" => "Ne haveblas sufiĉa spaco", "Upload cancelled." => "La alŝuto nuliĝis.", +"Could not get result from server." => "Ne povis ekhaviĝi rezulto el la servilo.", "File upload is in progress. Leaving the page now will cancel the upload." => "Dosieralŝuto plenumiĝas. Lasi la paĝon nun nuligus la alŝuton.", "URL cannot be empty" => "La URL ne povas malpleni", "{new_name} already exists" => "{new_name} jam ekzistas", @@ -59,6 +71,7 @@ $TRANSLATIONS = array( "From link" => "El ligilo", "Deleted files" => "Forigitaj dosieroj", "Cancel upload" => "Nuligi alŝuton", +"You don’t have permission to upload or create files here" => "Vi ne havas permeson alŝuti aŭ krei dosierojn ĉi tie", "Nothing in here. Upload something!" => "Nenio estas ĉi tie. Alŝutu ion!", "Download" => "Elŝuti", "Unshare" => "Malkunhavigi", diff --git a/apps/files/l10n/es.php b/apps/files/l10n/es.php index ded7b902aad..ab584edbf3d 100644 --- a/apps/files/l10n/es.php +++ b/apps/files/l10n/es.php @@ -60,6 +60,7 @@ $TRANSLATIONS = array( "Name" => "Nombre", "Size" => "Tamaño", "Modified" => "Modificado", +"Invalid folder name. Usage of 'Shared' is reserved." => "Nombre de carpeta inválido. El uso de \"Shared\" esta reservado.", "%s could not be renamed" => "%s no pudo ser renombrado", "Upload" => "Subir", "File handling" => "Administración de archivos", diff --git a/apps/files/l10n/et_EE.php b/apps/files/l10n/et_EE.php index 80f65682471..83a8adf052c 100644 --- a/apps/files/l10n/et_EE.php +++ b/apps/files/l10n/et_EE.php @@ -60,6 +60,7 @@ $TRANSLATIONS = array( "Name" => "Nimi", "Size" => "Suurus", "Modified" => "Muudetud", +"Invalid folder name. Usage of 'Shared' is reserved." => "Vigane kausta nimi. Nime 'Shared' kasutamine on reserveeritud.", "%s could not be renamed" => "%s ümbernimetamine ebaõnnestus", "Upload" => "Lae üles", "File handling" => "Failide käsitlemine", diff --git a/apps/files/l10n/fi_FI.php b/apps/files/l10n/fi_FI.php index 3a9d4132fa2..93d29aba677 100644 --- a/apps/files/l10n/fi_FI.php +++ b/apps/files/l10n/fi_FI.php @@ -4,6 +4,7 @@ $TRANSLATIONS = array( "Could not move %s" => "Kohteen %s siirto ei onnistunut", "File name cannot be empty." => "Tiedoston nimi ei voi olla tyhjä.", "File name must not contain \"/\". Please choose a different name." => "Tiedoston nimessä ei saa olla merkkiä \"/\". Valitse toinen nimi.", +"The name %s is already used in the folder %s. Please choose a different name." => "Nimi %s on jo käytössä kansiossa %s. Valitse toinen nimi.", "Not a valid source" => "Virheellinen lähde", "Error when creating the file" => "Virhe tiedostoa luotaessa", "Folder name cannot be empty." => "Kansion nimi ei voi olla tyhjä.", @@ -25,6 +26,7 @@ $TRANSLATIONS = array( "Upload cancelled." => "Lähetys peruttu.", "Could not get result from server." => "Tuloksien saaminen palvelimelta ei onnistunut.", "File upload is in progress. Leaving the page now will cancel the upload." => "Tiedoston lähetys on meneillään. Sivulta poistuminen nyt peruu tiedoston lähetyksen.", +"URL cannot be empty" => "Osoite ei voi olla tyhjä", "{new_name} already exists" => "{new_name} on jo olemassa", "Could not create file" => "Tiedoston luominen epäonnistui", "Could not create folder" => "Kansion luominen epäonnistui", @@ -42,6 +44,7 @@ $TRANSLATIONS = array( "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Virheellinen nimi, merkit '\\', '/', '<', '>', ':', '\"', '|', '?' ja '*' eivät ole sallittuja.", "Your storage is full, files can not be updated or synced anymore!" => "Tallennustila on loppu, tiedostoja ei voi enää päivittää tai synkronoida!", "Your storage is almost full ({usedSpacePercent}%)" => "Tallennustila on melkein loppu ({usedSpacePercent}%)", +"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Salaus poistettiin käytöstä, mutta tiedostosi ovat edelleen salattu. Siirry henkilökohtaisiin asetuksiisi avataksesi tiedostojesi salauksen.", "Your download is being prepared. This might take some time if the files are big." => "Lataustasi valmistellaan. Tämä saattaa kestää hetken, jos tiedostot ovat suuria kooltaan.", "Error moving file" => "Virhe tiedostoa siirrettäessä", "Error" => "Virhe", diff --git a/apps/files/l10n/fr.php b/apps/files/l10n/fr.php index ce3529f70aa..74f9599ade2 100644 --- a/apps/files/l10n/fr.php +++ b/apps/files/l10n/fr.php @@ -45,7 +45,7 @@ $TRANSLATIONS = array( "undo" => "annuler", "_%n folder_::_%n folders_" => array("%n dossier","%n dossiers"), "_%n file_::_%n files_" => array("%n fichier","%n fichiers"), -"{dirs} and {files}" => "{dir} et {files}", +"{dirs} and {files}" => "{dirs} et {files}", "_Uploading %n file_::_Uploading %n files_" => array("Téléversement de %n fichier","Téléversement de %n fichiers"), "'.' is an invalid file name." => "'.' n'est pas un nom de fichier valide.", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nom invalide, les caractères '\\', '/', '<', '>', ':', '\"', '|', '?' et '*' ne sont pas autorisés.", @@ -60,6 +60,7 @@ $TRANSLATIONS = array( "Name" => "Nom", "Size" => "Taille", "Modified" => "Modifié", +"Invalid folder name. Usage of 'Shared' is reserved." => "Nom de dossier invalide. L'utilisation du mot 'Shared' est réservée.", "%s could not be renamed" => "%s ne peut être renommé", "Upload" => "Envoyer", "File handling" => "Gestion des fichiers", diff --git a/apps/files/l10n/gl.php b/apps/files/l10n/gl.php index e7d1564b966..4edb889bb4d 100644 --- a/apps/files/l10n/gl.php +++ b/apps/files/l10n/gl.php @@ -60,6 +60,7 @@ $TRANSLATIONS = array( "Name" => "Nome", "Size" => "Tamaño", "Modified" => "Modificado", +"Invalid folder name. Usage of 'Shared' is reserved." => "Nome de cartafol non válido. O uso de «Shared» está reservado.", "%s could not be renamed" => "%s non pode cambiar de nome", "Upload" => "Enviar", "File handling" => "Manexo de ficheiro", diff --git a/apps/files/l10n/lb.php b/apps/files/l10n/lb.php index 2eddea39627..bd95197746e 100644 --- a/apps/files/l10n/lb.php +++ b/apps/files/l10n/lb.php @@ -10,6 +10,7 @@ $TRANSLATIONS = array( "Upload cancelled." => "Upload ofgebrach.", "File upload is in progress. Leaving the page now will cancel the upload." => "File Upload am gaang. Wann's de des Säit verléiss gëtt den Upload ofgebrach.", "Share" => "Deelen", +"Rename" => "Ëm-benennen", "undo" => "réckgängeg man", "_%n folder_::_%n folders_" => array("",""), "_%n file_::_%n files_" => array("",""), diff --git a/apps/files/l10n/nl.php b/apps/files/l10n/nl.php index b4bbdd456ad..c3bb9ffcacd 100644 --- a/apps/files/l10n/nl.php +++ b/apps/files/l10n/nl.php @@ -60,6 +60,7 @@ $TRANSLATIONS = array( "Name" => "Naam", "Size" => "Grootte", "Modified" => "Aangepast", +"Invalid folder name. Usage of 'Shared' is reserved." => "Ongeldige mapnaam. Gebruik van 'Shared' is gereserveerd.", "%s could not be renamed" => "%s kon niet worden hernoemd", "Upload" => "Uploaden", "File handling" => "Bestand", diff --git a/apps/files/l10n/pt_BR.php b/apps/files/l10n/pt_BR.php index 2e7c14acd9c..217e9f4599c 100644 --- a/apps/files/l10n/pt_BR.php +++ b/apps/files/l10n/pt_BR.php @@ -60,6 +60,7 @@ $TRANSLATIONS = array( "Name" => "Nome", "Size" => "Tamanho", "Modified" => "Modificado", +"Invalid folder name. Usage of 'Shared' is reserved." => "Nome da pasta inválido. Uso de 'Shared' é reservado.", "%s could not be renamed" => "%s não pode ser renomeado", "Upload" => "Upload", "File handling" => "Tratamento de Arquivo", diff --git a/apps/files/l10n/ru.php b/apps/files/l10n/ru.php index 6d7edd938e3..f437aafc602 100644 --- a/apps/files/l10n/ru.php +++ b/apps/files/l10n/ru.php @@ -60,6 +60,7 @@ $TRANSLATIONS = array( "Name" => "Имя", "Size" => "Размер", "Modified" => "Изменён", +"Invalid folder name. Usage of 'Shared' is reserved." => "Неправильное имя каталога. Имя 'Shared' зарезервировано.", "%s could not be renamed" => "%s не может быть переименован", "Upload" => "Загрузка", "File handling" => "Управление файлами", diff --git a/apps/files/l10n/ru_RU.php b/apps/files/l10n/ru_RU.php index 3b69c96bcdd..3660b300c2b 100644 --- a/apps/files/l10n/ru_RU.php +++ b/apps/files/l10n/ru_RU.php @@ -8,6 +8,7 @@ $TRANSLATIONS = array( "_Uploading %n file_::_Uploading %n files_" => array("","",""), "Error" => "Ошибка", "Upload" => "Загрузка", +"Save" => "Сохранить", "Cancel upload" => "Отмена загрузки", "Download" => "Загрузка" ); diff --git a/apps/files/l10n/uk.php b/apps/files/l10n/uk.php index cb0006a29fd..5a8872c970f 100644 --- a/apps/files/l10n/uk.php +++ b/apps/files/l10n/uk.php @@ -3,6 +3,7 @@ $TRANSLATIONS = array( "Could not move %s - File with this name already exists" => "Не вдалося перемістити %s - Файл з таким ім'ям вже існує", "Could not move %s" => "Не вдалося перемістити %s", "File name cannot be empty." => " Ім'я файлу не може бути порожнім.", +"Folder name cannot be empty." => "Ім'я теки не може бути порожнім.", "Unable to set upload directory." => "Не вдалося встановити каталог завантаження.", "No file was uploaded. Unknown error" => "Не завантажено жодного файлу. Невідома помилка", "There is no error, the file uploaded with success" => "Файл успішно вивантажено без помилок.", @@ -18,21 +19,26 @@ $TRANSLATIONS = array( "Not enough space available" => "Місця більше немає", "Upload cancelled." => "Завантаження перервано.", "File upload is in progress. Leaving the page now will cancel the upload." => "Виконується завантаження файлу. Закриття цієї сторінки приведе до відміни завантаження.", +"URL cannot be empty" => "URL не може бути порожнім", "{new_name} already exists" => "{new_name} вже існує", +"Could not create file" => "Не вдалося створити файл", +"Could not create folder" => "Не вдалося створити теку", "Share" => "Поділитися", "Delete permanently" => "Видалити назавжди", "Rename" => "Перейменувати", "Pending" => "Очікування", +"Could not rename file" => "Неможливо перейменувати файл", "replaced {new_name} with {old_name}" => "замінено {new_name} на {old_name}", "undo" => "відмінити", "_%n folder_::_%n folders_" => array("%n тека","%n тека","%n теки"), -"_%n file_::_%n files_" => array("","",""), +"_%n file_::_%n files_" => array("%n файл","%n файлів","%n файли"), "_Uploading %n file_::_Uploading %n files_" => array("","",""), "'.' is an invalid file name." => "'.' це невірне ім'я файлу.", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Невірне ім'я, '\\', '/', '<', '>', ':', '\"', '|', '?' та '*' не дозволені.", "Your storage is full, files can not be updated or synced anymore!" => "Ваше сховище переповнене, файли більше не можуть бути оновлені або синхронізовані !", "Your storage is almost full ({usedSpacePercent}%)" => "Ваше сховище майже повне ({usedSpacePercent}%)", "Your download is being prepared. This might take some time if the files are big." => "Ваше завантаження готується. Це може зайняти деякий час, якщо файли завеликі.", +"Error moving file" => "Помилка переміщення файлу", "Error" => "Помилка", "Name" => "Ім'я", "Size" => "Розмір", diff --git a/apps/files/l10n/uz.php b/apps/files/l10n/uz.php new file mode 100644 index 00000000000..70ab6572ba4 --- /dev/null +++ b/apps/files/l10n/uz.php @@ -0,0 +1,7 @@ +<?php +$TRANSLATIONS = array( +"_%n folder_::_%n folders_" => array(""), +"_%n file_::_%n files_" => array(""), +"_Uploading %n file_::_Uploading %n files_" => array("") +); +$PLURAL_FORMS = "nplurals=1; plural=0;"; diff --git a/apps/files/lib/helper.php b/apps/files/lib/helper.php index 709d78a4d45..eaff28178ea 100644 --- a/apps/files/lib/helper.php +++ b/apps/files/lib/helper.php @@ -30,7 +30,7 @@ class Helper if ($sid[0] === 'shared') { return \OC_Helper::mimetypeIcon('dir-shared'); } - if ($sid[0] !== 'local') { + if ($sid[0] !== 'local' and $sid[0] !== 'home') { return \OC_Helper::mimetypeIcon('dir-external'); } } @@ -40,7 +40,7 @@ class Helper if($file['isPreviewAvailable']) { $pathForPreview = $file['directory'] . '/' . $file['name']; - return \OC_Helper::previewIcon($pathForPreview); + return \OC_Helper::previewIcon($pathForPreview) . '&c=' . $file['etag']; } return \OC_Helper::mimetypeIcon($file['mimetype']); } diff --git a/apps/files/templates/part.list.php b/apps/files/templates/part.list.php index a6d2e44f34f..2f630e1f014 100644 --- a/apps/files/templates/part.list.php +++ b/apps/files/templates/part.list.php @@ -16,6 +16,7 @@ $totalsize = 0; ?> data-type="<?php ($file['type'] == 'dir')?p('dir'):p('file')?>" data-mime="<?php p($file['mimetype'])?>" data-size="<?php p($file['size']);?>" + data-etag="<?php p($file['etag']);?>" data-permissions="<?php p($file['permissions']); ?>"> <?php if($file['isPreviewAvailable']): ?> <td class="filename svg preview-icon" diff --git a/apps/files_encryption/l10n/ca.php b/apps/files_encryption/l10n/ca.php index 0c3ff1def8f..fc2886d7b94 100644 --- a/apps/files_encryption/l10n/ca.php +++ b/apps/files_encryption/l10n/ca.php @@ -9,6 +9,7 @@ $TRANSLATIONS = array( "Private key password successfully updated." => "La contrasenya de la clau privada s'ha actualitzat.", "Could not update the private key password. Maybe the old password was not correct." => "No s'ha pogut actualitzar la contrasenya de la clau privada. Potser la contrasenya anterior no era correcta.", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "L'aplicació d'encriptació no està inicialitzada! Potser l'aplicació d'encriptació ha estat reiniciada durant la sessió. Intenteu sortir i acreditar-vos de nou per reinicialitzar l'aplicació d'encriptació.", +"Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "La clau privada no és vàlida! Probablement la contrasenya va ser canviada des de fora de %s (per exemple, en el directori de l'empresa). Vostè pot actualitzar la contrasenya de clau privada en la seva configuració personal per poder recuperar l'accés en els arxius xifrats.", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." => "No es pot desencriptar aquest fitxer, probablement és un fitxer compartit. Demaneu al propietari del fitxer que el comparteixi de nou amb vós.", "Unknown error please check your system settings or contact your administrator" => "Error desconegut. Comproveu l'arranjament del sistema o contacteu amb l'administrador", "Missing requirements." => "Manca de requisits.", diff --git a/apps/files_encryption/l10n/de.php b/apps/files_encryption/l10n/de.php index 4c032afdea5..3feb1fbd323 100644 --- a/apps/files_encryption/l10n/de.php +++ b/apps/files_encryption/l10n/de.php @@ -9,6 +9,7 @@ $TRANSLATIONS = array( "Private key password successfully updated." => "Passwort des privaten Schlüssels erfolgreich aktualisiert", "Could not update the private key password. Maybe the old password was not correct." => "Das Passwort des privaten Schlüssels konnte nicht aktualisiert werden. Eventuell war das alte Passwort falsch.", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "Verschlüsselung-App ist nicht initialisiert! Vielleicht wurde die Verschlüsselung-App in der aktuellen Sitzung reaktiviert. Bitte versuche Dich ab- und wieder anzumelden, um die Verschlüsselung-App zu initialisieren.", +"Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "Dein privater Schlüssel ist ungültig. Möglicher Weise wurde außerhalb von%s Dein Passwort geändert (z.B. in deinem gemeinsamen Verzeichnis). Du kannst das Passwort deines privaten Schlüssels in den persönlichen Einstellungen aktualisieren, um wieder an deine Dateien zu gelangen.", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." => "Die Datei kann nicht entschlüsselt werden, da die Datei möglicherweise eine geteilte Datei ist. Bitte frage den Datei-Besitzer, dass er die Datei nochmals mit Dir teilt.", "Unknown error please check your system settings or contact your administrator" => "Unbekannter Fehler, bitte prüfe Deine Systemeinstellungen oder kontaktiere Deinen Administrator", "Missing requirements." => "Fehlende Vorraussetzungen", diff --git a/apps/files_encryption/l10n/de_DE.php b/apps/files_encryption/l10n/de_DE.php index c46f8b9a5d9..c9e677e70f6 100644 --- a/apps/files_encryption/l10n/de_DE.php +++ b/apps/files_encryption/l10n/de_DE.php @@ -9,6 +9,7 @@ $TRANSLATIONS = array( "Private key password successfully updated." => "Das Passwort des privaten Schlüssels wurde erfolgreich aktualisiert.", "Could not update the private key password. Maybe the old password was not correct." => "Das Passwort des privaten Schlüssels konnte nicht aktualisiert werden. Vielleicht war das alte Passwort nicht richtig.", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "Verschlüsselung-App ist nicht initialisiert! Vielleicht wurde die Verschlüsselung-App in der aktuellen Sitzung reaktiviert. Bitte versuchen Sie sich ab- und wieder anzumelden, um die Verschlüsselung-App zu initialisieren.", +"Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "Ihr privater Schlüssel ist ungültig. Möglicher Weise wurde außerhalb von %s Ihr Passwort geändert (z.B. in Ihrem gemeinsamen Verzeichnis). Sie können das Passwort Ihres privaten Schlüssels in den persönlichen Einstellungen aktualisieren, um wieder an Ihre Dateien zu gelangen.", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." => "Die Datei kann nicht entschlüsselt werden, da die Datei möglicherweise eine geteilte Datei ist. Bitte fragen Sie den Datei-Besitzer, dass er die Datei nochmals mit Ihnen teilt.", "Unknown error please check your system settings or contact your administrator" => "Unbekannter Fehler, bitte prüfen Sie die Systemeinstellungen oder kontaktieren Sie Ihren Administrator", "Missing requirements." => "Fehlende Voraussetzungen", diff --git a/apps/files_encryption/l10n/en_GB.php b/apps/files_encryption/l10n/en_GB.php index b3447619061..3f7c6993415 100644 --- a/apps/files_encryption/l10n/en_GB.php +++ b/apps/files_encryption/l10n/en_GB.php @@ -9,6 +9,7 @@ $TRANSLATIONS = array( "Private key password successfully updated." => "Private key password updated successfully.", "Could not update the private key password. Maybe the old password was not correct." => "Could not update the private key password. Maybe the old password was not correct.", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "Encryption app not initialised! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialise the encryption app.", +"Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files.", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." => "Cannot decrypt this file, which is probably a shared file. Please ask the file owner to reshare the file with you.", "Unknown error please check your system settings or contact your administrator" => "Unknown error. Please check your system settings or contact your administrator", "Missing requirements." => "Missing requirements.", diff --git a/apps/files_encryption/l10n/es.php b/apps/files_encryption/l10n/es.php index fb344a557e4..42479d712fd 100644 --- a/apps/files_encryption/l10n/es.php +++ b/apps/files_encryption/l10n/es.php @@ -9,6 +9,7 @@ $TRANSLATIONS = array( "Private key password successfully updated." => "Contraseña de clave privada actualizada con éxito.", "Could not update the private key password. Maybe the old password was not correct." => "No se pudo cambiar la contraseña. Puede que la contraseña antigua no sea correcta.", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "¡La aplicación de cifrado no ha sido inicializada! Quizá fue restablecida durante tu sesión. Por favor intenta cerrar la sesión y volver a iniciarla para inicializar la aplicación de cifrado.", +"Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "¡Su clave privada no es válida! Tal vez su contraseña ha sido cambiada desde fuera. de %s (Ej:Su directorio corporativo). Puede actualizar la contraseña de su clave privada en sus opciones personales para recuperar el acceso a sus archivos.", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." => "No fue posible descifrar este archivo, probablemente se trate de un archivo compartido. Solicite al propietario del mismo que vuelva a compartirlo con usted.", "Unknown error please check your system settings or contact your administrator" => "Error desconocido. Verifique la configuración de su sistema o póngase en contacto con su administrador", "Missing requirements." => "Requisitos incompletos.", diff --git a/apps/files_encryption/l10n/et_EE.php b/apps/files_encryption/l10n/et_EE.php index c0c5a371aec..0b6ca48732e 100644 --- a/apps/files_encryption/l10n/et_EE.php +++ b/apps/files_encryption/l10n/et_EE.php @@ -9,6 +9,7 @@ $TRANSLATIONS = array( "Private key password successfully updated." => "Privaatse võtme parool edukalt uuendatud.", "Could not update the private key password. Maybe the old password was not correct." => "Ei suutnud uuendada privaatse võtme parooli. Võib-olla polnud vana parool õige.", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "Krüpteerimise rakend pole käivitatud. Võib-olla krüpteerimise rakend taaskäivitati sinu sessiooni kestel. Palun proovi logida välja ning uuesti sisse käivitamaks krüpteerimise rakendit.", +"Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "Sinu provaatne võti pole kehtiv! Tõenäoliselt mudueti parooli väljaspool kausta %s (nt. sinu ettevõtte kaust). Sa saad uuendada oma privaatse võtme parooli oma isiklikes seadetes, et taastada ligipääs sinu krüpteeritud failidele.", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." => "Sa ei saa seda faili dekrüpteerida, see on tõenäoliselt jagatud fail. Palun lase omanikul seda faili sinuga uuesti jagada.", "Unknown error please check your system settings or contact your administrator" => "Tundmatu tõrge. Palun kontrolli süsteemi seadeid või võta ühendust oma süsteemi administraatoriga", "Missing requirements." => "Nõutavad on puudu.", diff --git a/apps/files_encryption/l10n/fr.php b/apps/files_encryption/l10n/fr.php index bdb036615c4..a7096d54270 100644 --- a/apps/files_encryption/l10n/fr.php +++ b/apps/files_encryption/l10n/fr.php @@ -9,6 +9,7 @@ $TRANSLATIONS = array( "Private key password successfully updated." => "Mot de passe de la clé privé mis à jour avec succès.", "Could not update the private key password. Maybe the old password was not correct." => "Impossible de mettre à jour le mot de passe de la clé privé. Peut-être que l'ancien mot de passe n'était pas correcte.", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "L'application de chiffrement n'est pas initialisée ! Peut-être que cette application a été réactivée pendant votre session. Veuillez essayer de vous déconnecter et ensuite de vous reconnecter pour initialiser l'application de chiffrement.", +"Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "Votre clef privée est invalide ! Votre mot de passe a probablement été modifié hors de %s (ex. votre annuaire d'entreprise). Vous pouvez mettre à jour le mot de passe de votre clef privée dans les paramètres personnels pour pouvoir récupérer l'accès à vos fichiers chiffrés.", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." => "Impossible de déchiffrer ce fichier, il s'agit probablement d'un fichier partagé. Veuillez demander au propriétaire de ce fichier de le repartager avec vous.", "Unknown error please check your system settings or contact your administrator" => "Erreur inconnue. Veuillez vérifier vos paramètres système ou contacter votre administrateur.", "Missing requirements." => "Système minimum requis non respecté.", diff --git a/apps/files_encryption/l10n/gl.php b/apps/files_encryption/l10n/gl.php index 93e6eaf392e..4599d14113f 100644 --- a/apps/files_encryption/l10n/gl.php +++ b/apps/files_encryption/l10n/gl.php @@ -9,6 +9,7 @@ $TRANSLATIONS = array( "Private key password successfully updated." => "A chave privada foi actualizada correctamente.", "Could not update the private key password. Maybe the old password was not correct." => "Non foi posíbel actualizar o contrasinal da chave privada. É probábel que o contrasinal antigo non sexa correcto.", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "Non se iniciou o aplicativo de cifrado! Quizais volva a activarse durante a sesión. Tente pechar a sesión e volver iniciala que tamén se inicie o aplicativo de cifrado.", +"Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "A chave privada non é correcta! É probábel que o seu contrasinal teña sido cambiado desde o exterior do %s (p.ex. o seu directorio corporativo). Vostede pode actualizar o contrasinal da súa chave privada nos seus axustes persoais para recuperar o acceso aos seus ficheiros", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." => "Non foi posíbel descifrar o ficheiro, probabelmente tratase dun ficheiro compartido. Pidalle ao propietario do ficheiro que volva compartir o ficheiro con vostede.", "Unknown error please check your system settings or contact your administrator" => "Produciuse un erro descoñecido. Comprobe os axustes do sistema ou póñase en contacto co administrador", "Missing requirements." => "Non se cumpren os requisitos.", diff --git a/apps/files_encryption/l10n/nl.php b/apps/files_encryption/l10n/nl.php index fbbc90737a2..dce0be56d99 100644 --- a/apps/files_encryption/l10n/nl.php +++ b/apps/files_encryption/l10n/nl.php @@ -9,6 +9,7 @@ $TRANSLATIONS = array( "Private key password successfully updated." => "Privésleutel succesvol bijgewerkt.", "Could not update the private key password. Maybe the old password was not correct." => "Kon het wachtwoord van de privésleutel niet wijzigen. Misschien was het oude wachtwoord onjuist.", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "Crypto app niet geïnitialiseerd. Misschien werd de crypto app geheractiveerd tijdens de sessie. Log uit en log daarna opnieuw in om de crypto app te initialiseren.", +"Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "Uw privésleutel is niet geldig! Waarschijnlijk is uw wachtwoord gewijzigd buiten %s (bijv. uw corporate directory). U kunt uw privésleutel wachtwoord in uw persoonlijke instellingen bijwerken om toegang te krijgen tot uw versleutelde bestanden.", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." => "Kan dit bestand niet ontcijferen, waarschijnlijk is het een gedeeld bestand, Vraag de eigenaar om het bestand opnieuw met u te delen.", "Unknown error please check your system settings or contact your administrator" => "Onbekende fout, Controleer uw systeeminstellingen of neem contact op met uw systeembeheerder", "Missing requirements." => "Missende benodigdheden.", diff --git a/apps/files_encryption/l10n/pt_BR.php b/apps/files_encryption/l10n/pt_BR.php index fd3e7298bd5..b09b4367c4e 100644 --- a/apps/files_encryption/l10n/pt_BR.php +++ b/apps/files_encryption/l10n/pt_BR.php @@ -9,6 +9,7 @@ $TRANSLATIONS = array( "Private key password successfully updated." => "Senha de chave privada atualizada com sucesso.", "Could not update the private key password. Maybe the old password was not correct." => "Não foi possível atualizar a senha de chave privada. Talvez a senha antiga esteja incorreta.", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "Aplicativo de criptografia não foi inicializado! Talvez o aplicativo de criptografia tenha sido reativado durante essa sessão. Por favor, tente fazer logoff e login novamente para inicializar o aplicativo de criptografia.", +"Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "Sua chave privada não é válida! Provavelmente sua senha foi alterada fora de %s (por exemplo, seu diretório corporativo). Você pode atualizar sua senha de chave privada em suas configurações pessoais para recuperar o acesso a seus arquivos criptografados.", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." => "Este arquivo não pode ser decriptado, provavelmente este é um arquivo compartilhado. Poe favoe peça ao dono do arquivo para compartilha-lo com você.", "Unknown error please check your system settings or contact your administrator" => "Erro desconhecido, por favor verifique suas configurações ou faça contato com o administrador", "Missing requirements." => "Requisitos não encontrados.", diff --git a/apps/files_encryption/l10n/ru.php b/apps/files_encryption/l10n/ru.php index e45cb1dfa4f..ace2bad5fbe 100644 --- a/apps/files_encryption/l10n/ru.php +++ b/apps/files_encryption/l10n/ru.php @@ -9,6 +9,7 @@ $TRANSLATIONS = array( "Private key password successfully updated." => "Пароль секретного ключа успешно обновлён.", "Could not update the private key password. Maybe the old password was not correct." => "Невозможно обновить пароль от секретного ключа. Возможно, старый пароль указан неверно.", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "Приложение шифрации не инициализированно! Возможно приложение шифрации было реактивировано во время вашей сессии. Пожалуйста, попробуйте выйти и войти снова чтобы проинициализировать приложение шифрации.", +"Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "Ваш секретный ключ не действителен! Вероятно, ваш пароль был изменен вне %s (например, корпоративный каталог). Вы можете обновить секретный ключ в личных настройках на странице восстановления доступа к зашифрованным файлам. ", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." => "Не могу расшифровать файл, возможно это опубликованный файл. Пожалуйста, попросите владельца файла поделиться им с вами еще раз.", "Unknown error please check your system settings or contact your administrator" => "Неизвестная ошибка, пожалуйста, проверьте системные настройки или свяжитесь с администратором", "Missing requirements." => "Требования отсутствуют.", diff --git a/apps/files_encryption/l10n/zh_TW.php b/apps/files_encryption/l10n/zh_TW.php index 371a58c0d2e..8972490ea5a 100644 --- a/apps/files_encryption/l10n/zh_TW.php +++ b/apps/files_encryption/l10n/zh_TW.php @@ -1,15 +1,42 @@ <?php $TRANSLATIONS = array( +"Recovery key successfully enabled" => "還原金鑰已成功開啟", +"Could not enable recovery key. Please check your recovery key password!" => "無法啟用還原金鑰。請檢查您的還原金鑰密碼!", +"Recovery key successfully disabled" => "還原金鑰已成功停用", +"Could not disable recovery key. Please check your recovery key password!" => "無法停用還原金鑰。請檢查您的還原金鑰密碼!", "Password successfully changed." => "成功變更密碼。", "Could not change the password. Maybe the old password was not correct." => "無法變更密碼,或許是輸入的舊密碼不正確。", +"Private key password successfully updated." => "私人金鑰密碼已成功更新。", +"Could not update the private key password. Maybe the old password was not correct." => "無法更新私人金鑰密碼。可能舊的密碼不正確。", +"Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "加密功能未初始化!可能加密功能需要重新啟用在現在的連線上。請試著登出再登入來初始化加密功能。", +"Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "您的私人金鑰不正確!可能您的密碼已經變更在外部的 %s (例如:您的企業目錄)。您可以在您的個人設定中更新私人金鑰密碼來還原存取您的加密檔案。", +"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." => "無法解密這個檔案,也許這是分享的檔案。請詢問檔案所有人重新分享檔案給您。", +"Unknown error please check your system settings or contact your administrator" => "未知錯誤請檢查您的系統設定或是聯絡您的管理員", +"Missing requirements." => "遺失必要條件。", +"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "請確認已安裝 PHP 5.3.3 或是更新的版本以及 OpenSSL 也一併安裝在 PHP extension 裡面並啟用及設置完成。現在,加密功能是停用的。", +"Following users are not set up for encryption:" => "以下的使用者無法設定加密:", "Saving..." => "儲存中...", +"Go directly to your " => "直接到您的", +"personal settings" => "個人設定", "Encryption" => "加密", +"Enable recovery key (allow to recover users files in case of password loss):" => "啟用還原金鑰 (因忘記密碼仍允許還原使用者檔案):", +"Recovery key password" => "還原金鑰密碼", +"Repeat Recovery key password" => "再輸入還原金鑰密碼一次", "Enabled" => "已啓用", "Disabled" => "已停用", +"Change recovery key password:" => "變更還原金鑰密碼:", +"Old Recovery key password" => "舊的還原金鑰密碼", +"New Recovery key password" => "新的還原金鑰密碼", +"Repeat New Recovery key password" => "再輸入新的還原金鑰密碼一次", "Change Password" => "變更密碼", +"Your private key password no longer match your log-in password:" => "您的私人金鑰密碼不符合您的登入密碼:", +"Set your old private key password to your current log-in password." => "設定您的舊私人金鑰密碼到您現在的登入密碼。", " If you don't remember your old password you can ask your administrator to recover your files." => "如果您忘記舊密碼,可以請求管理員協助取回檔案。", "Old log-in password" => "舊登入密碼", "Current log-in password" => "目前的登入密碼", +"Update Private Key Password" => "更新私人金鑰密碼", +"Enable password recovery:" => "啟用密碼還原:", +"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" => "啟用這個選項將會允許您因忘記密碼但需要存取您的加密檔案", "File recovery settings updated" => "檔案還原設定已更新", "Could not update file recovery" => "無法更新檔案還原設定" ); diff --git a/apps/files_encryption/lib/helper.php b/apps/files_encryption/lib/helper.php index 91dd08ec08d..314ac577b2f 100755 --- a/apps/files_encryption/lib/helper.php +++ b/apps/files_encryption/lib/helper.php @@ -157,6 +157,49 @@ class Helper { return $return; } + /** + * @brief Check if a path is a .part file + * @param string $path Path that may identify a .part file + * @return bool + */ + public static function isPartialFilePath($path) { + + $extension = pathinfo($path, PATHINFO_EXTENSION); + if ( $extension === 'part' || $extension === 'etmp') { + return true; + } else { + return false; + } + + } + + + /** + * @brief Remove .path extension from a file path + * @param string $path Path that may identify a .part file + * @return string File path without .part extension + * @note this is needed for reusing keys + */ + public static function stripPartialFileExtension($path) { + $extension = pathinfo($path, PATHINFO_EXTENSION); + + if ( $extension === 'part' || $extension === 'etmp') { + + $newLength = strlen($path) - 5; // 5 = strlen(".part") = strlen(".etmp") + $fPath = substr($path, 0, $newLength); + + // if path also contains a transaction id, we remove it too + $extension = pathinfo($fPath, PATHINFO_EXTENSION); + if(substr($extension, 0, 12) === 'ocTransferId') { // 12 = strlen("ocTransferId") + $newLength = strlen($fPath) - strlen($extension) -1; + $fPath = substr($fPath, 0, $newLength); + } + return $fPath; + + } else { + return $path; + } + } /** * @brief disable recovery diff --git a/apps/files_encryption/lib/keymanager.php b/apps/files_encryption/lib/keymanager.php index 7143fcff0f6..6dadd12a62e 100755 --- a/apps/files_encryption/lib/keymanager.php +++ b/apps/files_encryption/lib/keymanager.php @@ -152,10 +152,10 @@ class Keymanager { } // try reusing key file if part file - if (self::isPartialFilePath($targetPath)) { + if (Helper::isPartialFilePath($targetPath)) { $result = $view->file_put_contents( - $basePath . '/' . self::fixPartialFilePath($targetPath) . '.key', $catfile); + $basePath . '/' . Helper::stripPartialFileExtension($targetPath) . '.key', $catfile); } else { @@ -170,48 +170,6 @@ class Keymanager { } /** - * @brief Remove .path extension from a file path - * @param string $path Path that may identify a .part file - * @return string File path without .part extension - * @note this is needed for reusing keys - */ - public static function fixPartialFilePath($path) { - - if (preg_match('/\.part$/', $path) || preg_match('/\.etmp$/', $path)) { - - $newLength = strlen($path) - 5; - $fPath = substr($path, 0, $newLength); - - return $fPath; - - } else { - - return $path; - - } - - } - - /** - * @brief Check if a path is a .part file - * @param string $path Path that may identify a .part file - * @return bool - */ - public static function isPartialFilePath($path) { - - if (preg_match('/\.part$/', $path) || preg_match('/\.etmp$/', $path)) { - - return true; - - } else { - - return false; - - } - - } - - /** * @brief retrieve keyfile for an encrypted file * @param \OC_FilesystemView $view * @param $userId @@ -226,7 +184,7 @@ class Keymanager { $util = new Util($view, \OCP\User::getUser()); list($owner, $filename) = $util->getUidAndFilename($filePath); - $filename = self::fixPartialFilePath($filename); + $filename = Helper::stripPartialFileExtension($filename); $filePath_f = ltrim($filename, '/'); // in case of system wide mount points the keys are stored directly in the data directory @@ -385,8 +343,8 @@ class Keymanager { foreach ($shareKeys as $userId => $shareKey) { // try reusing key file if part file - if (self::isPartialFilePath($shareKeyPath)) { - $writePath = $basePath . '/' . self::fixPartialFilePath($shareKeyPath) . '.' . $userId . '.shareKey'; + if (Helper::isPartialFilePath($shareKeyPath)) { + $writePath = $basePath . '/' . Helper::stripPartialFileExtension($shareKeyPath) . '.' . $userId . '.shareKey'; } else { $writePath = $basePath . '/' . $shareKeyPath . '.' . $userId . '.shareKey'; } @@ -422,7 +380,7 @@ class Keymanager { $util = new Util($view, \OCP\User::getUser()); list($owner, $filename) = $util->getUidAndFilename($filePath); - $filename = self::fixPartialFilePath($filename); + $filename = Helper::stripPartialFileExtension($filename); // in case of system wide mount points the keys are stored directly in the data directory if ($util->isSystemWideMountPoint($filename)) { $shareKeyPath = '/files_encryption/share-keys/' . $filename . '.' . $userId . '.shareKey'; diff --git a/apps/files_encryption/lib/proxy.php b/apps/files_encryption/lib/proxy.php index 6dc5c9ce1b8..e2bc8f6b163 100644 --- a/apps/files_encryption/lib/proxy.php +++ b/apps/files_encryption/lib/proxy.php @@ -342,7 +342,7 @@ class Proxy extends \OC_FileProxy { $fileInfo = false; // get file info from database/cache if not .part file - if (!Keymanager::isPartialFilePath($path)) { + if (!Helper::isPartialFilePath($path)) { $fileInfo = $view->getFileInfo($path); } @@ -353,7 +353,7 @@ class Proxy extends \OC_FileProxy { $fixSize = $util->getFileSize($path); $fileInfo['unencrypted_size'] = $fixSize; // put file info if not .part file - if (!Keymanager::isPartialFilePath($relativePath)) { + if (!Helper::isPartialFilePath($relativePath)) { $view->putFileInfo($path, $fileInfo); } } @@ -372,7 +372,7 @@ class Proxy extends \OC_FileProxy { $fileInfo['unencrypted_size'] = $size; // put file info if not .part file - if (!Keymanager::isPartialFilePath($relativePath)) { + if (!Helper::isPartialFilePath($relativePath)) { $view->putFileInfo($path, $fileInfo); } } diff --git a/apps/files_encryption/lib/util.php b/apps/files_encryption/lib/util.php index 5e855abd973..f099a36d0c0 100644 --- a/apps/files_encryption/lib/util.php +++ b/apps/files_encryption/lib/util.php @@ -1145,10 +1145,7 @@ class Util { // Make sure that a share key is generated for the owner too list($owner, $ownerPath) = $this->getUidAndFilename($filePath); - $pathinfo = pathinfo($ownerPath); - if(array_key_exists('extension', $pathinfo) && $pathinfo['extension'] === 'part') { - $ownerPath = $pathinfo['dirname'] . '/' . $pathinfo['filename']; - } + $ownerPath = \OCA\Encryption\Helper::stripPartialFileExtension($ownerPath); $userIds = array(); if ($sharingEnabled) { diff --git a/apps/files_encryption/tests/helper.php b/apps/files_encryption/tests/helper.php new file mode 100644 index 00000000000..067fc763a95 --- /dev/null +++ b/apps/files_encryption/tests/helper.php @@ -0,0 +1,54 @@ +<?php +/** + * Copyright (c) 2013 Bjoern Schiessle <schiessle@owncloud.com> + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + + +require_once __DIR__ . '/../lib/helper.php'; + +use OCA\Encryption; + +/** + * Class Test_Encryption_Helper + */ +class Test_Encryption_Helper extends \PHPUnit_Framework_TestCase { + + /** + * @medium + */ + function testStripPartialFileExtension() { + + $partFilename = 'testfile.txt.part'; + $filename = 'testfile.txt'; + + $this->assertTrue(Encryption\Helper::isPartialFilePath($partFilename)); + + $this->assertEquals('testfile.txt', Encryption\Helper::stripPartialFileExtension($partFilename)); + + $this->assertFalse(Encryption\Helper::isPartialFilePath($filename)); + + $this->assertEquals('testfile.txt', Encryption\Helper::stripPartialFileExtension($filename)); + } + + + /** + * @medium + */ + function testStripPartialFileExtensionWithTransferIdPath() { + + $partFilename = 'testfile.txt.ocTransferId643653835.part'; + $filename = 'testfile.txt'; + + $this->assertTrue(Encryption\Helper::isPartialFilePath($partFilename)); + + $this->assertEquals('testfile.txt', Encryption\Helper::stripPartialFileExtension($partFilename)); + + $this->assertFalse(Encryption\Helper::isPartialFilePath($filename)); + + $this->assertEquals('testfile.txt', Encryption\Helper::stripPartialFileExtension($filename)); + } + +}
\ No newline at end of file diff --git a/apps/files_encryption/tests/keymanager.php b/apps/files_encryption/tests/keymanager.php index b2d200cca3e..ad6bbd3a7e9 100644 --- a/apps/files_encryption/tests/keymanager.php +++ b/apps/files_encryption/tests/keymanager.php @@ -191,23 +191,6 @@ class Test_Encryption_Keymanager extends \PHPUnit_Framework_TestCase { /** * @medium */ - function testFixPartialFilePath() { - - $partFilename = 'testfile.txt.part'; - $filename = 'testfile.txt'; - - $this->assertTrue(Encryption\Keymanager::isPartialFilePath($partFilename)); - - $this->assertEquals('testfile.txt', Encryption\Keymanager::fixPartialFilePath($partFilename)); - - $this->assertFalse(Encryption\Keymanager::isPartialFilePath($filename)); - - $this->assertEquals('testfile.txt', Encryption\Keymanager::fixPartialFilePath($filename)); - } - - /** - * @medium - */ function testRecursiveDelShareKeys() { // generate filename diff --git a/apps/files_external/ajax/dropbox.php b/apps/files_external/ajax/dropbox.php index bc9821c62ec..91c465500d0 100644 --- a/apps/files_external/ajax/dropbox.php +++ b/apps/files_external/ajax/dropbox.php @@ -1,6 +1,6 @@ <?php -require_once 'Dropbox/autoload.php'; +require_once __DIR__ . '/../3rdparty/Dropbox/autoload.php'; OCP\JSON::checkAppEnabled('files_external'); OCP\JSON::checkLoggedIn(); diff --git a/apps/files_external/css/settings.css b/apps/files_external/css/settings.css index 0ebae9d82be..9858c10ea35 100644 --- a/apps/files_external/css/settings.css +++ b/apps/files_external/css/settings.css @@ -18,3 +18,7 @@ tr:hover>td.remove>img { visibility:visible; cursor:pointer; } #addMountPoint>td { border:none; } #addMountPoint>td.applicable { visibility:hidden; } #selectBackend { margin-left:-10px; } + +#externalStorage label > input[type="checkbox"] { + margin-right: 3px; +} diff --git a/apps/files_sharing/lib/cache.php b/apps/files_sharing/lib/cache.php index 6b66edcacc5..90440d08f4e 100644 --- a/apps/files_sharing/lib/cache.php +++ b/apps/files_sharing/lib/cache.php @@ -99,9 +99,13 @@ class Shared_Cache extends Cache { $data['fileid'] = (int)$data['fileid']; $data['size'] = (int)$data['size']; $data['mtime'] = (int)$data['mtime']; + $data['storage_mtime'] = (int)$data['storage_mtime']; $data['encrypted'] = (bool)$data['encrypted']; $data['mimetype'] = $this->getMimetype($data['mimetype']); $data['mimepart'] = $this->getMimetype($data['mimepart']); + if ($data['storage_mtime'] === 0) { + $data['storage_mtime'] = $data['mtime']; + } return $data; } return false; diff --git a/apps/files_sharing/lib/sharedstorage.php b/apps/files_sharing/lib/sharedstorage.php index 257da89c84e..3116cd717fb 100644 --- a/apps/files_sharing/lib/sharedstorage.php +++ b/apps/files_sharing/lib/sharedstorage.php @@ -34,16 +34,16 @@ class Shared extends \OC\Files\Storage\Common { $this->sharedFolder = $arguments['sharedFolder']; } - public function getId(){ + public function getId() { return 'shared::' . $this->sharedFolder; } /** - * @brief Get the source file path, permissions, and owner for a shared file - * @param string Shared target file path - * @return Returns array with the keys path, permissions, and owner or false if not found - */ - private function getFile($target) { + * @brief Get the source file path, permissions, and owner for a shared file + * @param string Shared target file path + * @return Returns array with the keys path, permissions, and owner or false if not found + */ + public function getFile($target) { if (!isset($this->files[$target])) { // Check for partial files if (pathinfo($target, PATHINFO_EXTENSION) === 'part') { @@ -62,18 +62,18 @@ class Shared extends \OC\Files\Storage\Common { } /** - * @brief Get the source file path for a shared file - * @param string Shared target file path - * @return string source file path or false if not found - */ - private function getSourcePath($target) { + * @brief Get the source file path for a shared file + * @param string Shared target file path + * @return string source file path or false if not found + */ + public function getSourcePath($target) { $source = $this->getFile($target); if ($source) { if (!isset($source['fullPath'])) { \OC\Files\Filesystem::initMountPoints($source['fileOwner']); $mount = \OC\Files\Filesystem::getMountByNumericId($source['storage']); if (is_array($mount)) { - $this->files[$target]['fullPath'] = $mount[key($mount)]->getMountPoint().$source['path']; + $this->files[$target]['fullPath'] = $mount[key($mount)]->getMountPoint() . $source['path']; } else { $this->files[$target]['fullPath'] = false; } @@ -84,10 +84,10 @@ class Shared extends \OC\Files\Storage\Common { } /** - * @brief Get the permissions granted for a shared file - * @param string Shared target file path - * @return int CRUDS permissions granted or false if not found - */ + * @brief Get the permissions granted for a shared file + * @param string Shared target file path + * @return int CRUDS permissions granted or false if not found + */ public function getPermissions($target) { $source = $this->getFile($target); if ($source) { @@ -222,7 +222,7 @@ class Shared extends \OC\Files\Storage\Common { if ($path == '' || $path == '/') { $mtime = 0; $dh = $this->opendir($path); - if(is_resource($dh)) { + if (is_resource($dh)) { while (($filename = readdir($dh)) !== false) { $tempmtime = $this->filemtime($filename); if ($tempmtime > $mtime) { @@ -244,7 +244,7 @@ class Shared extends \OC\Files\Storage\Common { $source = $this->getSourcePath($path); if ($source) { $info = array( - 'target' => $this->sharedFolder.$path, + 'target' => $this->sharedFolder . $path, 'source' => $source, ); \OCP\Util::emitHook('\OC\Files\Storage\Shared', 'file_get_contents', $info); @@ -257,13 +257,14 @@ class Shared extends \OC\Files\Storage\Common { if ($source = $this->getSourcePath($path)) { // Check if permission is granted if (($this->file_exists($path) && !$this->isUpdatable($path)) - || ($this->is_dir($path) && !$this->isCreatable($path))) { + || ($this->is_dir($path) && !$this->isCreatable($path)) + ) { return false; } $info = array( - 'target' => $this->sharedFolder.$path, - 'source' => $source, - ); + 'target' => $this->sharedFolder . $path, + 'source' => $source, + ); \OCP\Util::emitHook('\OC\Files\Storage\Shared', 'file_put_contents', $info); list($storage, $internalPath) = \OC\Files\Filesystem::resolvePath($source); $result = $storage->file_put_contents($internalPath, $data); @@ -304,31 +305,16 @@ class Shared extends \OC\Files\Storage\Common { $pos1 = strpos($path1, '/', 1); $pos2 = strpos($path2, '/', 1); if ($pos1 !== false && $pos2 !== false && ($oldSource = $this->getSourcePath($path1))) { - $newSource = $this->getSourcePath(dirname($path2)).'/'.basename($path2); - if (dirname($path1) == dirname($path2)) { - // Rename the file if UPDATE permission is granted - if ($this->isUpdatable($path1)) { - list($storage, $oldInternalPath) = \OC\Files\Filesystem::resolvePath($oldSource); - list( , $newInternalPath) = \OC\Files\Filesystem::resolvePath($newSource); - return $storage->rename($oldInternalPath, $newInternalPath); - } - } else { - // Move the file if DELETE and CREATE permissions are granted - if ($this->isDeletable($path1) && $this->isCreatable(dirname($path2))) { - // Get the root shared folder - $folder1 = substr($path1, 0, $pos1); - $folder2 = substr($path2, 0, $pos2); - // Copy and unlink the file if it exists in a different shared folder - if ($folder1 != $folder2) { - if ($this->copy($path1, $path2)) { - return $this->unlink($path1); - } - } else { - list($storage, $oldInternalPath) = \OC\Files\Filesystem::resolvePath($oldSource); - list( , $newInternalPath) = \OC\Files\Filesystem::resolvePath($newSource); - return $storage->rename($oldInternalPath, $newInternalPath); - } - } + $newSource = $this->getSourcePath(dirname($path2)) . '/' . basename($path2); + // Within the same folder, we only need UPDATE permissions + if (dirname($path1) == dirname($path2) and $this->isUpdatable($path1)) { + list($storage, $oldInternalPath) = \OC\Files\Filesystem::resolvePath($oldSource); + list(, $newInternalPath) = \OC\Files\Filesystem::resolvePath($newSource); + return $storage->rename($oldInternalPath, $newInternalPath); + // otherwise DELETE and CREATE permissions required + } elseif ($this->isDeletable($path1) && $this->isCreatable(dirname($path2))) { + $rootView = new \OC\Files\View(''); + return $rootView->rename($oldSource, $newSource); } } } @@ -338,10 +324,10 @@ class Shared extends \OC\Files\Storage\Common { public function copy($path1, $path2) { // Copy the file if CREATE permission is granted if ($this->isCreatable(dirname($path2))) { - $source = $this->fopen($path1, 'r'); - $target = $this->fopen($path2, 'w'); - list ($count, $result) = \OC_Helper::streamCopy($source, $target); - return $result; + $oldSource = $this->getSourcePath($path1); + $newSource = $this->getSourcePath(dirname($path2)) . '/' . basename($path2); + $rootView = new \OC\Files\View(''); + return $rootView->copy($oldSource, $newSource); } return false; } @@ -363,16 +349,16 @@ class Shared extends \OC\Files\Storage\Common { case 'xb': case 'a': case 'ab': - $exists = $this->file_exists($path); - if ($exists && !$this->isUpdatable($path)) { - return false; - } - if (!$exists && !$this->isCreatable(dirname($path))) { - return false; - } + $exists = $this->file_exists($path); + if ($exists && !$this->isUpdatable($path)) { + return false; + } + if (!$exists && !$this->isCreatable(dirname($path))) { + return false; + } } $info = array( - 'target' => $this->sharedFolder.$path, + 'target' => $this->sharedFolder . $path, 'source' => $source, 'mode' => $mode, ); @@ -412,6 +398,7 @@ class Shared extends \OC\Files\Storage\Common { } return false; } + public function touch($path, $mtime = null) { if ($source = $this->getSourcePath($path)) { list($storage, $internalPath) = \OC\Files\Filesystem::resolvePath($source); @@ -422,11 +409,12 @@ class Shared extends \OC\Files\Storage\Common { public static function setup($options) { if (!\OCP\User::isLoggedIn() || \OCP\User::getUser() != $options['user'] - || \OCP\Share::getItemsSharedWith('file')) { + || \OCP\Share::getItemsSharedWith('file') + ) { $user_dir = $options['user_dir']; \OC\Files\Filesystem::mount('\OC\Files\Storage\Shared', array('sharedFolder' => '/Shared'), - $user_dir.'/Shared/'); + $user_dir . '/Shared/'); } } diff --git a/apps/files_sharing/lib/watcher.php b/apps/files_sharing/lib/watcher.php index 6fdfc1db36d..c40cf6911b8 100644 --- a/apps/files_sharing/lib/watcher.php +++ b/apps/files_sharing/lib/watcher.php @@ -32,9 +32,32 @@ class Shared_Watcher extends Watcher { * @param string $path */ public function checkUpdate($path) { - if ($path != '') { - parent::checkUpdate($path); + if ($path != '' && parent::checkUpdate($path)) { + // since checkUpdate() has already updated the size of the subdirs, + // only apply the update to the owner's parent dirs + + // find last parent before reaching the shared storage root, + // which is the actual shared dir from the owner + $sepPos = strpos($path, '/'); + if ($sepPos > 0) { + $baseDir = substr($path, 0, $sepPos); + } else { + $baseDir = $path; + } + + // find the path relative to the data dir + $file = $this->storage->getFile($baseDir); + $view = new \OC\Files\View('/' . $file['fileOwner']); + + // find the owner's storage and path + list($storage, $internalPath) = $view->resolvePath($file['path']); + + // update the parent dirs' sizes in the owner's cache + $storage->getCache()->correctFolderSize(dirname($internalPath)); + + return true; } + return false; } /** diff --git a/apps/files_sharing/public.php b/apps/files_sharing/public.php index 3d02227cb08..6504de84386 100644 --- a/apps/files_sharing/public.php +++ b/apps/files_sharing/public.php @@ -28,7 +28,7 @@ function determineIcon($file, $sharingRoot, $sharingToken) { $relativePath = substr($file['path'], 6); $relativePath = substr($relativePath, strlen($sharingRoot)); if($file['isPreviewAvailable']) { - return OCP\publicPreview_icon($relativePath, $sharingToken); + return OCP\publicPreview_icon($relativePath, $sharingToken) . '&c=' . $file['etag']; } return OCP\mimetype_icon($file['mimetype']); } diff --git a/apps/files_sharing/tests/api.php b/apps/files_sharing/tests/api.php index 44fc4d8b7b3..1278e0c4d1f 100644 --- a/apps/files_sharing/tests/api.php +++ b/apps/files_sharing/tests/api.php @@ -20,90 +20,33 @@ * */ -require_once __DIR__ . '/../../../lib/base.php'; +require_once __DIR__ . '/base.php'; use OCA\Files\Share; /** * Class Test_Files_Sharing_Api */ -class Test_Files_Sharing_Api extends \PHPUnit_Framework_TestCase { - - const TEST_FILES_SHARING_API_USER1 = "test-share-user1"; - const TEST_FILES_SHARING_API_USER2 = "test-share-user2"; - const TEST_FILES_SHARING_API_USER3 = "test-share-user3"; - - public $stateFilesEncryption; - public $filename; - public $data; - /** - * @var OC_FilesystemView - */ - public $view; - public $folder; - - public static function setUpBeforeClass() { - // reset backend - \OC_User::clearBackends(); - \OC_User::useBackend('database'); - - // clear share hooks - \OC_Hook::clear('OCP\\Share'); - \OC::registerShareHooks(); - \OCP\Util::connectHook('OC_Filesystem', 'setup', '\OC\Files\Storage\Shared', 'setup'); - - // create users - self::loginHelper(\Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER1, true); - self::loginHelper(\Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2, true); - self::loginHelper(\Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER3, true); - - } +class Test_Files_Sharing_Api extends Test_Files_Sharing_Base { function setUp() { - - //login as user1 - \Test_Files_Sharing_Api::loginHelper(\Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER1); - - $this->data = 'foobar'; - $this->view = new \OC_FilesystemView('/' . \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER1 . '/files'); + parent::setUp(); $this->folder = '/folder_share_api_test'; $this->filename = 'share-api-test.txt'; - // remember files_encryption state - $this->stateFilesEncryption = \OC_App::isEnabled('files_encryption'); - - //we don't want to tests with app files_encryption enabled - \OC_App::disable('files_encryption'); - - - $this->assertTrue(!\OC_App::isEnabled('files_encryption')); - // save file with content $this->view->file_put_contents($this->filename, $this->data); $this->view->mkdir($this->folder); $this->view->file_put_contents($this->folder.'/'.$this->filename, $this->data); - } function tearDown() { $this->view->unlink($this->filename); $this->view->deleteAll($this->folder); - // reset app files_encryption - if ($this->stateFilesEncryption) { - \OC_App::enable('files_encryption'); - } else { - \OC_App::disable('files_encryption'); - } - } - - public static function tearDownAfterClass() { - // cleanup users - \OC_User::deleteUser(\Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER1); - \OC_User::deleteUser(\Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2); - \OC_User::deleteUser(\Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER3); + parent::tearDown(); } /** @@ -548,50 +491,4 @@ class Test_Files_Sharing_Api extends \PHPUnit_Framework_TestCase { $this->assertTrue(empty($itemsAfterDelete)); } - - /** - * @param $user - * @param bool $create - * @param bool $password - */ - private static function loginHelper($user, $create = false, $password = false) { - if ($create) { - \OC_User::createUser($user, $user); - } - - if ($password === false) { - $password = $user; - } - - \OC_Util::tearDownFS(); - \OC_User::setUserId(''); - \OC\Files\Filesystem::tearDown(); - \OC_Util::setupFS($user); - \OC_User::setUserId($user); - - $params['uid'] = $user; - $params['password'] = $password; - } - - /** - * @brief get some information from a given share - * @param int $shareID - * @return array with: item_source, share_type, share_with, item_type, permissions - */ - private function getShareFromId($shareID) { - $sql = 'SELECT `item_source`, `share_type`, `share_with`, `item_type`, `permissions` FROM `*PREFIX*share` WHERE `id` = ?'; - $args = array($shareID); - $query = \OCP\DB::prepare($sql); - $result = $query->execute($args); - - $share = Null; - - if ($result && $result->numRows() > 0) { - $share = $result->fetchRow(); - } - - return $share; - - } - } diff --git a/apps/files_sharing/tests/base.php b/apps/files_sharing/tests/base.php new file mode 100644 index 00000000000..689c80cb9e6 --- /dev/null +++ b/apps/files_sharing/tests/base.php @@ -0,0 +1,143 @@ +<?php +/** + * ownCloud + * + * @author Bjoern Schiessle + * @copyright 2013 Bjoern Schiessle <schiessle@owncloud.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see <http://www.gnu.org/licenses/>. + * + */ + +require_once __DIR__ . '/../../../lib/base.php'; + +use OCA\Files\Share; + +/** + * Class Test_Files_Sharing_Base + * + * Base class for sharing tests. + */ +abstract class Test_Files_Sharing_Base extends \PHPUnit_Framework_TestCase { + + const TEST_FILES_SHARING_API_USER1 = "test-share-user1"; + const TEST_FILES_SHARING_API_USER2 = "test-share-user2"; + const TEST_FILES_SHARING_API_USER3 = "test-share-user3"; + + public $stateFilesEncryption; + public $filename; + public $data; + /** + * @var OC_FilesystemView + */ + public $view; + public $folder; + + public static function setUpBeforeClass() { + // reset backend + \OC_User::clearBackends(); + \OC_User::useBackend('database'); + + // clear share hooks + \OC_Hook::clear('OCP\\Share'); + \OC::registerShareHooks(); + \OCP\Util::connectHook('OC_Filesystem', 'setup', '\OC\Files\Storage\Shared', 'setup'); + + // create users + self::loginHelper(self::TEST_FILES_SHARING_API_USER1, true); + self::loginHelper(self::TEST_FILES_SHARING_API_USER2, true); + self::loginHelper(self::TEST_FILES_SHARING_API_USER3, true); + + } + + function setUp() { + + //login as user1 + self::loginHelper(self::TEST_FILES_SHARING_API_USER1); + + $this->data = 'foobar'; + $this->view = new \OC_FilesystemView('/' . self::TEST_FILES_SHARING_API_USER1 . '/files'); + // remember files_encryption state + $this->stateFilesEncryption = \OC_App::isEnabled('files_encryption'); + + //we don't want to tests with app files_encryption enabled + \OC_App::disable('files_encryption'); + + + $this->assertTrue(!\OC_App::isEnabled('files_encryption')); + } + + function tearDown() { + // reset app files_encryption + if ($this->stateFilesEncryption) { + \OC_App::enable('files_encryption'); + } else { + \OC_App::disable('files_encryption'); + } + } + + public static function tearDownAfterClass() { + + // cleanup users + \OC_User::deleteUser(self::TEST_FILES_SHARING_API_USER1); + \OC_User::deleteUser(self::TEST_FILES_SHARING_API_USER2); + \OC_User::deleteUser(self::TEST_FILES_SHARING_API_USER3); + } + + /** + * @param $user + * @param bool $create + * @param bool $password + */ + protected static function loginHelper($user, $create = false, $password = false) { + if ($create) { + \OC_User::createUser($user, $user); + } + + if ($password === false) { + $password = $user; + } + + \OC_Util::tearDownFS(); + \OC_User::setUserId(''); + \OC\Files\Filesystem::tearDown(); + \OC_Util::setupFS($user); + \OC_User::setUserId($user); + + $params['uid'] = $user; + $params['password'] = $password; + } + + /** + * @brief get some information from a given share + * @param int $shareID + * @return array with: item_source, share_type, share_with, item_type, permissions + */ + protected function getShareFromId($shareID) { + $sql = 'SELECT `item_source`, `share_type`, `share_with`, `item_type`, `permissions` FROM `*PREFIX*share` WHERE `id` = ?'; + $args = array($shareID); + $query = \OCP\DB::prepare($sql); + $result = $query->execute($args); + + $share = Null; + + if ($result && $result->numRows() > 0) { + $share = $result->fetchRow(); + } + + return $share; + + } + +} diff --git a/apps/files_sharing/tests/watcher.php b/apps/files_sharing/tests/watcher.php new file mode 100644 index 00000000000..1a9a54cbcf8 --- /dev/null +++ b/apps/files_sharing/tests/watcher.php @@ -0,0 +1,161 @@ +<?php +/** + * ownCloud + * + * @author Vincent Petry + * @copyright 2013 Vincent Petry <pvince81@owncloud.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see <http://www.gnu.org/licenses/>. + * + */ +require_once __DIR__ . '/base.php'; + +class Test_Files_Sharing_Watcher extends Test_Files_Sharing_Base { + + function setUp() { + parent::setUp(); + + self::loginHelper(self::TEST_FILES_SHARING_API_USER1); + + // prepare user1's dir structure + $textData = "dummy file data\n"; + $this->view->mkdir('container'); + $this->view->mkdir('container/shareddir'); + $this->view->mkdir('container/shareddir/subdir'); + + list($this->ownerStorage, $internalPath) = $this->view->resolvePath(''); + $this->ownerCache = $this->ownerStorage->getCache(); + $this->ownerStorage->getScanner()->scan(''); + + // share "shareddir" with user2 + $fileinfo = $this->view->getFileInfo('container/shareddir'); + \OCP\Share::shareItem('folder', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER, + self::TEST_FILES_SHARING_API_USER2, 31); + + // login as user2 + self::loginHelper(self::TEST_FILES_SHARING_API_USER2); + + // retrieve the shared storage + $secondView = new \OC\Files\View('/' . self::TEST_FILES_SHARING_API_USER2); + list($this->sharedStorage, $internalPath) = $secondView->resolvePath('files/Shared/shareddir'); + $this->sharedCache = $this->sharedStorage->getCache(); + } + + function tearDown() { + $this->sharedCache->clear(); + + self::loginHelper(self::TEST_FILES_SHARING_API_USER1); + + $fileinfo = $this->view->getFileInfo('container/shareddir'); + \OCP\Share::unshare('folder', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER, + self::TEST_FILES_SHARING_API_USER2); + + $this->view->deleteAll('container'); + + $this->ownerCache->clear(); + + parent::tearDown(); + } + + /** + * Tests that writing a file using the shared storage will propagate the file + * size to the owner's parent folders. + */ + function testFolderSizePropagationToOwnerStorage() { + $initialSizes = self::getOwnerDirSizes('files/container/shareddir'); + + $textData = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; + $dataLen = strlen($textData); + $this->sharedCache->put('shareddir/bar.txt', array('storage_mtime' => 10)); + $this->sharedStorage->file_put_contents('shareddir/bar.txt', $textData); + $this->sharedCache->put('shareddir', array('storage_mtime' => 10)); + + // run the propagation code + $result = $this->sharedStorage->getWatcher()->checkUpdate('shareddir'); + + $this->assertTrue($result); + + // the owner's parent dirs must have increase size + $newSizes = self::getOwnerDirSizes('files/container/shareddir'); + $this->assertEquals($initialSizes[''] + $dataLen, $newSizes['']); + $this->assertEquals($initialSizes['files'] + $dataLen, $newSizes['files']); + $this->assertEquals($initialSizes['files/container'] + $dataLen, $newSizes['files/container']); + $this->assertEquals($initialSizes['files/container/shareddir'] + $dataLen, $newSizes['files/container/shareddir']); + + // no more updates + $result = $this->sharedStorage->getWatcher()->checkUpdate('shareddir'); + + $this->assertFalse($result); + } + + /** + * Tests that writing a file using the shared storage will propagate the file + * size to the owner's parent folders. + */ + function testSubFolderSizePropagationToOwnerStorage() { + $initialSizes = self::getOwnerDirSizes('files/container/shareddir/subdir'); + + $textData = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; + $dataLen = strlen($textData); + $this->sharedCache->put('shareddir/subdir/bar.txt', array('storage_mtime' => 10)); + $this->sharedStorage->file_put_contents('shareddir/subdir/bar.txt', $textData); + $this->sharedCache->put('shareddir/subdir', array('storage_mtime' => 10)); + + // run the propagation code + $result = $this->sharedStorage->getWatcher()->checkUpdate('shareddir/subdir'); + + $this->assertTrue($result); + + // the owner's parent dirs must have increase size + $newSizes = self::getOwnerDirSizes('files/container/shareddir/subdir'); + $this->assertEquals($initialSizes[''] + $dataLen, $newSizes['']); + $this->assertEquals($initialSizes['files'] + $dataLen, $newSizes['files']); + $this->assertEquals($initialSizes['files/container'] + $dataLen, $newSizes['files/container']); + $this->assertEquals($initialSizes['files/container/shareddir'] + $dataLen, $newSizes['files/container/shareddir']); + $this->assertEquals($initialSizes['files/container/shareddir/subdir'] + $dataLen, $newSizes['files/container/shareddir/subdir']); + + // no more updates + $result = $this->sharedStorage->getWatcher()->checkUpdate('shareddir/subdir'); + + $this->assertFalse($result); + } + + function testNoUpdateOnRoot() { + // no updates when called for root path + $result = $this->sharedStorage->getWatcher()->checkUpdate(''); + + $this->assertFalse($result); + + // FIXME: for some reason when running this "naked" test, + // there will be remaining nonsensical entries in the + // database with a path "test-share-user1/container/..." + } + + /** + * Returns the sizes of the path and its parent dirs in a hash + * where the key is the path and the value is the size. + */ + function getOwnerDirSizes($path) { + $result = array(); + + while ($path != '' && $path != '' && $path != '.') { + $cachedData = $this->ownerCache->get($path); + $result[$path] = $cachedData['size']; + $path = dirname($path); + } + $cachedData = $this->ownerCache->get(''); + $result[''] = $cachedData['size']; + return $result; + } +} diff --git a/apps/files_trashbin/l10n/ms_MY.php b/apps/files_trashbin/l10n/ms_MY.php index 1972eba0318..e7721313918 100644 --- a/apps/files_trashbin/l10n/ms_MY.php +++ b/apps/files_trashbin/l10n/ms_MY.php @@ -1,7 +1,14 @@ <?php $TRANSLATIONS = array( +"Couldn't delete %s permanently" => "Tidak dapat menghapuskan %s secara kekal", +"Couldn't restore %s" => "Tidak dapat memulihkan %s", "Error" => "Ralat", +"restored" => "dipulihkan", +"Nothing in here. Your trash bin is empty!" => "Tiada apa disini. Tong sampah anda kosong!", "Name" => "Nama", -"Delete" => "Padam" +"Restore" => "Pulihkan", +"Deleted" => "Dihapuskan", +"Delete" => "Padam", +"Deleted Files" => "Fail Dihapus" ); $PLURAL_FORMS = "nplurals=1; plural=0;"; diff --git a/apps/files_trashbin/lib/trashbin.php b/apps/files_trashbin/lib/trashbin.php index c79afdc0c2e..f419f515f1e 100644 --- a/apps/files_trashbin/lib/trashbin.php +++ b/apps/files_trashbin/lib/trashbin.php @@ -530,6 +530,7 @@ class Trashbin { $size += $view->filesize('/files_trashbin/files/' . $file); } $view->unlink('/files_trashbin/files/' . $file); + \OC_Hook::emit('\OCP\Trashbin', 'delete', array('path' => '/files_trashbin/files/' . $file)); $trashbinSize -= $size; self::setTrashbinSize($user, $trashbinSize); diff --git a/apps/files_versions/js/versions.js b/apps/files_versions/js/versions.js index d118456d62e..738a7ece6f2 100644 --- a/apps/files_versions/js/versions.js +++ b/apps/files_versions/js/versions.js @@ -21,7 +21,7 @@ $(document).ready(function(){ // Action to perform when clicked if (scanFiles.scanning){return;}//workaround to prevent additional http request block scanning feedback - var file = $('#dir').val()+'/'+filename; + var file = $('#dir').val().replace(/(?!<=\/)$|\/$/, '/' + filename); var createDropDown = true; // Check if drop down is already visible for a different file if (($('#dropdown').length > 0) ) { diff --git a/apps/files_versions/l10n/ms_MY.php b/apps/files_versions/l10n/ms_MY.php new file mode 100644 index 00000000000..513dff49b24 --- /dev/null +++ b/apps/files_versions/l10n/ms_MY.php @@ -0,0 +1,10 @@ +<?php +$TRANSLATIONS = array( +"Could not revert: %s" => "Tidak dapat kembalikan: %s", +"Versions" => "Versi", +"Failed to revert {file} to revision {timestamp}." => "Gagal kembalikan {file} ke semakan {timestamp}.", +"More versions..." => "Lagi versi...", +"No other versions available" => "Tiada lagi versi lain", +"Restore" => "Pulihkan" +); +$PLURAL_FORMS = "nplurals=1; plural=0;"; diff --git a/apps/files_versions/lib/versions.php b/apps/files_versions/lib/versions.php index 225611374a6..661e98b09d5 100644 --- a/apps/files_versions/lib/versions.php +++ b/apps/files_versions/lib/versions.php @@ -156,6 +156,7 @@ class Storage { } foreach ($versions as $v) { unlink($abs_path . $v['version']); + \OC_Hook::emit('\OCP\Versions', 'delete', array('path' => $abs_path . $v['version'])); $versionsSize -= $v['size']; } self::setVersionsSize($uid, $versionsSize); @@ -465,6 +466,7 @@ class Storage { while ($availableSpace < 0 && $i < $numOfVersions) { $version = current($allVersions); $versionsFileview->unlink($version['path'].'.v'.$version['version']); + \OC_Hook::emit('\OCP\Versions', 'delete', array('path' => $version['path'].'.v'.$version['version'])); $versionsSize -= $version['size']; $availableSpace += $version['size']; next($allVersions); @@ -515,6 +517,7 @@ class Storage { if ($version['version'] > $nextVersion) { //distance between two version too small, delete version $versionsFileview->unlink($version['path'] . '.v' . $version['version']); + \OC_Hook::emit('\OCP\Versions', 'delete', array('path' => $version['path'] . '.v' . $version['version'])); $size += $version['size']; unset($allVersions[$key]); // update array with all versions } else { diff --git a/apps/user_ldap/css/settings.css b/apps/user_ldap/css/settings.css index 65bff3aadb7..be03419c2de 100644 --- a/apps/user_ldap/css/settings.css +++ b/apps/user_ldap/css/settings.css @@ -3,13 +3,9 @@ width: 60%; } -.tablecell { - display: table-cell !important; - white-space: nowrap; -} - .tablerow { display: table-row; + white-space: nowrap; } .tablerow input, .tablerow textarea { @@ -78,6 +74,11 @@ .wizSpinner { height: 15px; + margin: 0.3em; +} + +.ldapSettingControls { + margin-top: 3ex; } #ldap fieldset p label { @@ -90,9 +91,12 @@ padding-right: 5px; } +#ldap fieldset input[type=submit] { + width: auto; +} + #ldap fieldset input, #ldap fieldset textarea { width: 60%; - display: inline-block; } #ldap fieldset p input[type=checkbox] { diff --git a/apps/user_ldap/js/settings.js b/apps/user_ldap/js/settings.js index 4c2f182dad8..dcaeb70b57f 100644 --- a/apps/user_ldap/js/settings.js +++ b/apps/user_ldap/js/settings.js @@ -172,7 +172,7 @@ var LdapWizard = { pwd = $('#ldap_agent_password').val(); base = $('#ldap_base').val(); - if(host && port && agent && pwd && base) { + if((host && port && base) && ((!agent && !pwd) || (agent && pwd))) { $('.ldap_action_continue').removeAttr('disabled'); $('#ldapSettings').tabs('option', 'disabled', []); } else { @@ -192,19 +192,20 @@ var LdapWizard = { '&ldap_serverconfig_chooser='+$('#ldap_serverconfig_chooser').val(); LdapWizard.showSpinner('#ldap_base'); + $('#ldap_base').prop('disabled', 'disabled'); LdapWizard.ajax(param, function(result) { LdapWizard.applyChanges(result); LdapWizard.hideSpinner('#ldap_base'); if($('#ldap_base').val()) { - $('#ldap_base').removeClass('invisible'); LdapWizard.hideInfoBox(); } + $('#ldap_base').prop('disabled', false); }, function (result) { LdapWizard.hideSpinner('#ldap_base'); - $('#ldap_base').removeClass('invisible'); - LdapWizard.showInfoBox('Please specify a port'); + LdapWizard.showInfoBox('Please specify a Base DN'); + $('#ldap_base').prop('disabled', false); } ); } @@ -212,28 +213,28 @@ var LdapWizard = { checkPort: function() { host = $('#ldap_host').val(); - user = $('#ldap_dn').val(); - pass = $('#ldap_agent_password').val(); + port = $('#ldap_port').val(); - if(host && user && pass) { + if(host && !port) { param = 'action=guessPortAndTLS'+ '&ldap_serverconfig_chooser='+$('#ldap_serverconfig_chooser').val(); LdapWizard.showSpinner('#ldap_port'); + $('#ldap_port').prop('disabled', 'disabled'); LdapWizard.ajax(param, function(result) { LdapWizard.applyChanges(result); LdapWizard.hideSpinner('#ldap_port'); if($('#ldap_port').val()) { LdapWizard.checkBaseDN(); - $('#ldap_port').removeClass('invisible'); + $('#ldap_port').prop('disabled', false); LdapWizard.hideInfoBox(); } }, function (result) { LdapWizard.hideSpinner('#ldap_port'); - $('#ldap_port').removeClass('invisible'); - LdapWizard.showInfoBox('Please specify the BaseDN'); + $('#ldap_port').prop('disabled', false); + LdapWizard.showInfoBox('Please specify the Port'); } ); } @@ -461,12 +462,6 @@ var LdapWizard = { }, init: function() { - if($('#ldap_port').val()) { - $('#ldap_port').removeClass('invisible'); - } - if($('#ldap_base').val()) { - $('#ldap_base').removeClass('invisible'); - } LdapWizard.basicStatusCheck(); }, @@ -521,6 +516,8 @@ var LdapWizard = { }, processChanges: function(triggerObj) { + LdapWizard.hideInfoBox(); + if(triggerObj.id == 'ldap_host' || triggerObj.id == 'ldap_port' || triggerObj.id == 'ldap_dn' @@ -652,8 +649,8 @@ var LdapWizard = { $(document).ready(function() { $('#ldapAdvancedAccordion').accordion({ heightStyle: 'content', animate: 'easeInOutCirc'}); $('#ldapSettings').tabs({ beforeActivate: LdapWizard.onTabChange }); - $('#ldap_submit').button(); - $('#ldap_action_test_connection').button(); + $('.ldap_submit').button(); + $('.ldap_action_test_connection').button(); $('#ldap_action_delete_configuration').button(); LdapWizard.initMultiSelect($('#ldap_userfilter_groups'), 'ldap_userfilter_groups', @@ -682,7 +679,7 @@ $(document).ready(function() { event.preventDefault(); LdapWizard.controlBack(); }); - $('#ldap_action_test_connection').click(function(event){ + $('.ldap_action_test_connection').click(function(event){ event.preventDefault(); $.post( OC.filePath('user_ldap','ajax','testConfiguration.php'), @@ -716,18 +713,18 @@ $(document).ready(function() { ); }); - $('#ldap_submit').click(function(event) { + $('.ldap_submit').click(function(event) { event.preventDefault(); $.post( OC.filePath('user_ldap','ajax','setConfiguration.php'), $('#ldap').serialize(), function (result) { - bgcolor = $('#ldap_submit').css('background'); + bgcolor = $('.ldap_submit').css('background'); if (result.status === 'success') { //the dealing with colors is a but ugly, but the jQuery version in use has issues with rgba colors - $('#ldap_submit').css('background', '#fff'); - $('#ldap_submit').effect('highlight', {'color':'#A8FA87'}, 5000, function() { - $('#ldap_submit').css('background', bgcolor); + $('.ldap_submit').css('background', '#fff'); + $('.ldap_submit').effect('highlight', {'color':'#A8FA87'}, 5000, function() { + $('.ldap_submit').css('background', bgcolor); }); //update the Label in the config chooser caption = $('#ldap_serverconfig_chooser option:selected:first').text(); @@ -737,9 +734,9 @@ $(document).ready(function() { $('#ldap_serverconfig_chooser option:selected:first').text(caption); } else { - $('#ldap_submit').css('background', '#fff'); - $('#ldap_submit').effect('highlight', {'color':'#E97'}, 5000, function() { - $('#ldap_submit').css('background', bgcolor); + $('.ldap_submit').css('background', '#fff'); + $('.ldap_submit').effect('highlight', {'color':'#E97'}, 5000, function() { + $('.ldap_submit').css('background', bgcolor); }); } } diff --git a/apps/user_ldap/l10n/ar.php b/apps/user_ldap/l10n/ar.php index 47ec9db7909..2b0cbbd75a5 100644 --- a/apps/user_ldap/l10n/ar.php +++ b/apps/user_ldap/l10n/ar.php @@ -5,6 +5,7 @@ $TRANSLATIONS = array( "Select groups" => "إختر مجموعة", "_%s group found_::_%s groups found_" => array("","","","","",""), "_%s user found_::_%s users found_" => array("","","","","",""), +"Save" => "حفظ", "Help" => "المساعدة", "Host" => "المضيف", "Password" => "كلمة المرور", diff --git a/apps/user_ldap/l10n/bg_BG.php b/apps/user_ldap/l10n/bg_BG.php index c236e57e0ec..588f6d448b4 100644 --- a/apps/user_ldap/l10n/bg_BG.php +++ b/apps/user_ldap/l10n/bg_BG.php @@ -3,6 +3,7 @@ $TRANSLATIONS = array( "Error" => "Грешка", "_%s group found_::_%s groups found_" => array("",""), "_%s user found_::_%s users found_" => array("",""), +"Save" => "Запис", "Help" => "Помощ", "Password" => "Парола" ); diff --git a/apps/user_ldap/l10n/bn_BD.php b/apps/user_ldap/l10n/bn_BD.php index 517ce90096c..01b93a1f42e 100644 --- a/apps/user_ldap/l10n/bn_BD.php +++ b/apps/user_ldap/l10n/bn_BD.php @@ -3,6 +3,7 @@ $TRANSLATIONS = array( "Error" => "সমস্যা", "_%s group found_::_%s groups found_" => array("",""), "_%s user found_::_%s users found_" => array("",""), +"Save" => "সংরক্ষণ", "Help" => "সহায়িকা", "Host" => "হোস্ট", "You can omit the protocol, except you require SSL. Then start with ldaps://" => "SSL আবশ্যক না হলে আপনি এই প্রটোকলটি মুছে ফেলতে পারেন । এরপর শুরু করুন এটা দিয়ে ldaps://", diff --git a/apps/user_ldap/l10n/bs.php b/apps/user_ldap/l10n/bs.php index 1116aa8242b..7a64be44e0d 100644 --- a/apps/user_ldap/l10n/bs.php +++ b/apps/user_ldap/l10n/bs.php @@ -1,6 +1,7 @@ <?php $TRANSLATIONS = array( "_%s group found_::_%s groups found_" => array("","",""), -"_%s user found_::_%s users found_" => array("","","") +"_%s user found_::_%s users found_" => array("","",""), +"Save" => "Spasi" ); $PLURAL_FORMS = "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"; diff --git a/apps/user_ldap/l10n/ca.php b/apps/user_ldap/l10n/ca.php index f9c534e3fd2..2c5358d6c77 100644 --- a/apps/user_ldap/l10n/ca.php +++ b/apps/user_ldap/l10n/ca.php @@ -4,6 +4,7 @@ $TRANSLATIONS = array( "Failed to delete the server configuration" => "Ha fallat en eliminar la configuració del servidor", "The configuration is valid and the connection could be established!" => "La configuració és vàlida i s'ha pogut establir la comunicació!", "The configuration is valid, but the Bind failed. Please check the server settings and credentials." => "La configuració és vàlida, però ha fallat el Bind. Comproveu les credencials i l'arranjament del servidor.", +"The configuration is invalid. Please have a look at the logs for further details." => "La configuració no és vàlida. Per més detalls mireu al registre del sistema.", "No action specified" => "No heu especificat cap acció", "No configuration specified" => "No heu especificat cap configuració", "No data specified" => "No heu especificat cap dada", @@ -26,6 +27,7 @@ $TRANSLATIONS = array( "_%s user found_::_%s users found_" => array("S'ha trobat %s usuari","S'han trobat %s usuaris"), "Invalid Host" => "Ordinador central no vàlid", "Could not find the desired feature" => "La característica desitjada no s'ha trobat", +"Save" => "Desa", "Test Configuration" => "Comprovació de la configuració", "Help" => "Ajuda", "Limit the access to %s to groups meeting this criteria:" => "Limita l'accés a %s grups que compleixin amb el criteri:", diff --git a/apps/user_ldap/l10n/cs_CZ.php b/apps/user_ldap/l10n/cs_CZ.php index 9f496d1d0b2..8c90789251a 100644 --- a/apps/user_ldap/l10n/cs_CZ.php +++ b/apps/user_ldap/l10n/cs_CZ.php @@ -18,6 +18,7 @@ $TRANSLATIONS = array( "Confirm Deletion" => "Potvrdit smazání", "_%s group found_::_%s groups found_" => array("","",""), "_%s user found_::_%s users found_" => array("","",""), +"Save" => "Uložit", "Test Configuration" => "Vyzkoušet nastavení", "Help" => "Nápověda", "Add Server Configuration" => "Přidat nastavení serveru", diff --git a/apps/user_ldap/l10n/cy_GB.php b/apps/user_ldap/l10n/cy_GB.php index ef85b47fc05..65a78432c75 100644 --- a/apps/user_ldap/l10n/cy_GB.php +++ b/apps/user_ldap/l10n/cy_GB.php @@ -4,6 +4,7 @@ $TRANSLATIONS = array( "Error" => "Gwall", "_%s group found_::_%s groups found_" => array("","","",""), "_%s user found_::_%s users found_" => array("","","",""), +"Save" => "Cadw", "Help" => "Cymorth", "Password" => "Cyfrinair" ); diff --git a/apps/user_ldap/l10n/da.php b/apps/user_ldap/l10n/da.php index d27317f0cd2..c35e8561442 100644 --- a/apps/user_ldap/l10n/da.php +++ b/apps/user_ldap/l10n/da.php @@ -15,6 +15,7 @@ $TRANSLATIONS = array( "Confirm Deletion" => "Bekræft Sletning", "_%s group found_::_%s groups found_" => array("",""), "_%s user found_::_%s users found_" => array("",""), +"Save" => "Gem", "Test Configuration" => "Test Konfiguration", "Help" => "Hjælp", "Add Server Configuration" => "Tilføj Server Konfiguration", diff --git a/apps/user_ldap/l10n/de.php b/apps/user_ldap/l10n/de.php index c29a68aa6de..15eefd842c2 100644 --- a/apps/user_ldap/l10n/de.php +++ b/apps/user_ldap/l10n/de.php @@ -4,6 +4,7 @@ $TRANSLATIONS = array( "Failed to delete the server configuration" => "Löschen der Serverkonfiguration fehlgeschlagen", "The configuration is valid and the connection could be established!" => "Die Konfiguration ist gültig und die Verbindung konnte hergestellt werden!", "The configuration is valid, but the Bind failed. Please check the server settings and credentials." => "Die Konfiguration ist gültig aber die Verbindung ist fehlgeschlagen. Bitte überprüfe die Servereinstellungen und Anmeldeinformationen.", +"The configuration is invalid. Please have a look at the logs for further details." => "Die Konfiguration ist ungültig. Weitere Details kannst Du in den Logdateien nachlesen.", "No action specified" => "Keine Aktion spezifiziert", "No configuration specified" => "Keine Konfiguration spezifiziert", "No data specified" => "Keine Daten spezifiziert", @@ -26,6 +27,7 @@ $TRANSLATIONS = array( "_%s user found_::_%s users found_" => array("%s Benutzer gefunden","%s Benutzer gefunden"), "Invalid Host" => "Ungültiger Host", "Could not find the desired feature" => "Konnte die gewünschte Funktion nicht finden", +"Save" => "Speichern", "Test Configuration" => "Testkonfiguration", "Help" => "Hilfe", "Limit the access to %s to groups meeting this criteria:" => "Beschränke den Zugriff auf %s auf Gruppen, die die folgenden Kriterien erfüllen:", diff --git a/apps/user_ldap/l10n/de_CH.php b/apps/user_ldap/l10n/de_CH.php index c447f17a9ab..58660840be4 100644 --- a/apps/user_ldap/l10n/de_CH.php +++ b/apps/user_ldap/l10n/de_CH.php @@ -18,6 +18,7 @@ $TRANSLATIONS = array( "Confirm Deletion" => "Löschung bestätigen", "_%s group found_::_%s groups found_" => array("",""), "_%s user found_::_%s users found_" => array("",""), +"Save" => "Speichern", "Test Configuration" => "Testkonfiguration", "Help" => "Hilfe", "Add Server Configuration" => "Serverkonfiguration hinzufügen", diff --git a/apps/user_ldap/l10n/de_DE.php b/apps/user_ldap/l10n/de_DE.php index 462eb7364c8..0da5307d935 100644 --- a/apps/user_ldap/l10n/de_DE.php +++ b/apps/user_ldap/l10n/de_DE.php @@ -4,6 +4,7 @@ $TRANSLATIONS = array( "Failed to delete the server configuration" => "Löschen der Serverkonfiguration fehlgeschlagen", "The configuration is valid and the connection could be established!" => "Die Konfiguration ist gültig und die Verbindung konnte hergestellt werden!", "The configuration is valid, but the Bind failed. Please check the server settings and credentials." => "Die Konfiguration ist gültig aber die Verbindung ist fehlgeschlagen. Bitte überprüfen Sie die Servereinstellungen und die Anmeldeinformationen.", +"The configuration is invalid. Please have a look at the logs for further details." => "Die Konfiguration ist ungültig. Weitere Details können Sie in den Logdateien nachlesen.", "No action specified" => "Keine Aktion spezifiziert", "No configuration specified" => "Keine Konfiguration spezifiziert", "No data specified" => "Keine Daten spezifiziert", @@ -26,6 +27,7 @@ $TRANSLATIONS = array( "_%s user found_::_%s users found_" => array("%s Benutzer gefunden","%s Benutzer gefunden"), "Invalid Host" => "Ungültiger Host", "Could not find the desired feature" => "Konnte die gewünschte Funktion nicht finden", +"Save" => "Speichern", "Test Configuration" => "Testkonfiguration", "Help" => "Hilfe", "Limit the access to %s to groups meeting this criteria:" => "Beschränke den Zugriff auf %s auf Gruppen, die die folgenden Kriterien erfüllen:", diff --git a/apps/user_ldap/l10n/el.php b/apps/user_ldap/l10n/el.php index c72281b678b..2cd93a4f07f 100644 --- a/apps/user_ldap/l10n/el.php +++ b/apps/user_ldap/l10n/el.php @@ -16,6 +16,7 @@ $TRANSLATIONS = array( "Confirm Deletion" => "Επιβεβαίωση Διαγραφής", "_%s group found_::_%s groups found_" => array("",""), "_%s user found_::_%s users found_" => array("",""), +"Save" => "Αποθήκευση", "Test Configuration" => "Δοκιμαστικες ρυθμισεις", "Help" => "Βοήθεια", "Add Server Configuration" => "Προσθήκη Ρυθμίσεων Διακομιστή", diff --git a/apps/user_ldap/l10n/en_GB.php b/apps/user_ldap/l10n/en_GB.php index f1e5fc653a9..325256bc8c2 100644 --- a/apps/user_ldap/l10n/en_GB.php +++ b/apps/user_ldap/l10n/en_GB.php @@ -4,6 +4,7 @@ $TRANSLATIONS = array( "Failed to delete the server configuration" => "Failed to delete the server configuration", "The configuration is valid and the connection could be established!" => "The configuration is valid and the connection could be established!", "The configuration is valid, but the Bind failed. Please check the server settings and credentials." => "The configuration is valid, but the Bind failed. Please check the server settings and credentials.", +"The configuration is invalid. Please have a look at the logs for further details." => "The configuration is invalid. Please have a look at the logs for further details.", "No action specified" => "No action specified", "No configuration specified" => "No configuration specified", "No data specified" => "No data specified", @@ -26,6 +27,7 @@ $TRANSLATIONS = array( "_%s user found_::_%s users found_" => array("%s user found","%s users found"), "Invalid Host" => "Invalid Host", "Could not find the desired feature" => "Could not find the desired feature", +"Save" => "Save", "Test Configuration" => "Test Configuration", "Help" => "Help", "Limit the access to %s to groups meeting this criteria:" => "Limit the access to %s to groups meeting this criteria:", diff --git a/apps/user_ldap/l10n/eo.php b/apps/user_ldap/l10n/eo.php index 6707ed01ff0..92521d08029 100644 --- a/apps/user_ldap/l10n/eo.php +++ b/apps/user_ldap/l10n/eo.php @@ -7,12 +7,23 @@ $TRANSLATIONS = array( "Success" => "Sukceso", "Error" => "Eraro", "Select groups" => "Elekti grupojn", +"Select object classes" => "Elekti objektoklasojn", +"Select attributes" => "Elekti atribuojn", "Connection test succeeded" => "Provo de konekto sukcesis", "Connection test failed" => "Provo de konekto malsukcesis", -"_%s group found_::_%s groups found_" => array("",""), -"_%s user found_::_%s users found_" => array("",""), +"Confirm Deletion" => "Konfirmi forigon", +"_%s group found_::_%s groups found_" => array("%s grupo troviĝis","%s grupoj troviĝis"), +"_%s user found_::_%s users found_" => array("%s uzanto troviĝis","%s uzanto troviĝis"), +"Invalid Host" => "Nevalida gastigo", +"Save" => "Konservi", "Test Configuration" => "Provi agordon", "Help" => "Helpo", +"only those object classes:" => "nur tiuj objektoklasoj:", +"only from those groups:" => "nur el tiuj grupoj:", +"groups found" => "grupoj trovitaj", +"LDAP Username:" => "LDAP-uzantonomo:", +"LDAP Email Address:" => "LDAP-retpoŝtadreso:", +"Other Attributes:" => "Aliaj atribuoj:", "Add Server Configuration" => "Aldoni agordon de servilo", "Host" => "Gastigo", "You can omit the protocol, except you require SSL. Then start with ldaps://" => "Vi povas neglekti la protokolon, escepte se vi bezonas SSL-on. Tiuokaze, komencu per ldaps://", @@ -20,17 +31,29 @@ $TRANSLATIONS = array( "User DN" => "Uzanto-DN", "Password" => "Pasvorto", "For anonymous access, leave DN and Password empty." => "Por sennoman aliron, lasu DN-on kaj Pasvorton malplenaj.", +"users found" => "uzantoj trovitaj", "Back" => "Antaŭen", +"Connection Settings" => "Agordo de konekto", "User Login Filter" => "Filtrilo de uzantensaluto", +"Disable Main Server" => "Malkapabligi la ĉefan servilon", "Case insensitve LDAP server (Windows)" => "LDAP-servilo blinda je litergrandeco (Vindozo)", "Turn off SSL certificate validation." => "Malkapabligi validkontrolon de SSL-atestiloj.", +"Cache Time-To-Live" => "Vivotempo de la kaŝmemoro", "in seconds. A change empties the cache." => "sekunde. Ajna ŝanĝo malplenigas la kaŝmemoron.", "User Display Name Field" => "Kampo de vidignomo de uzanto", "Base User Tree" => "Baza uzantarbo", "Group Display Name Field" => "Kampo de vidignomo de grupo", "Base Group Tree" => "Baza gruparbo", +"Group Search Attributes" => "Atribuoj de gruposerĉo", "Group-Member association" => "Asocio de grupo kaj membro", +"Special Attributes" => "Specialaj atribuoj", +"Quota Field" => "Kampo de kvoto", "in bytes" => "duumoke", -"Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." => "Lasu malplena por uzantonomo (defaŭlto). Alie, specifu LDAP/AD-atributon." +"Email Field" => "Kampo de retpoŝto", +"Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." => "Lasu malplena por uzantonomo (defaŭlto). Alie, specifu LDAP/AD-atributon.", +"Internal Username" => "Ena uzantonomo", +"Internal Username Attribute:" => "Atribuo de ena uzantonomo:", +"UUID Attribute for Users:" => "UUID-atribuo por uzantoj:", +"UUID Attribute for Groups:" => "UUID-atribuo por grupoj:" ); $PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/user_ldap/l10n/es.php b/apps/user_ldap/l10n/es.php index 8ea8b46742d..804cc9e4f16 100644 --- a/apps/user_ldap/l10n/es.php +++ b/apps/user_ldap/l10n/es.php @@ -4,6 +4,7 @@ $TRANSLATIONS = array( "Failed to delete the server configuration" => "No se pudo borrar la configuración del servidor", "The configuration is valid and the connection could be established!" => "¡La configuración es válida y la conexión puede establecerse!", "The configuration is valid, but the Bind failed. Please check the server settings and credentials." => "La configuración es válida, pero falló el Enlace. Por favor, compruebe la configuración del servidor y las credenciales.", +"The configuration is invalid. Please have a look at the logs for further details." => "La configuración no es válida. Por favor, busque en el log para más detalles.", "No action specified" => "No se ha especificado la acción", "No configuration specified" => "No se ha especificado la configuración", "No data specified" => "No se han especificado los datos", @@ -26,6 +27,7 @@ $TRANSLATIONS = array( "_%s user found_::_%s users found_" => array("Usuario %s encontrado","Usuarios %s encontrados"), "Invalid Host" => "Host inválido", "Could not find the desired feature" => "No se puede encontrar la función deseada.", +"Save" => "Guardar", "Test Configuration" => "Configuración de prueba", "Help" => "Ayuda", "Limit the access to %s to groups meeting this criteria:" => "Limitar el acceso a %s a los grupos que cumplan este criterio:", diff --git a/apps/user_ldap/l10n/es_AR.php b/apps/user_ldap/l10n/es_AR.php index 156b881413a..76fe0491241 100644 --- a/apps/user_ldap/l10n/es_AR.php +++ b/apps/user_ldap/l10n/es_AR.php @@ -18,6 +18,7 @@ $TRANSLATIONS = array( "Confirm Deletion" => "Confirmar borrado", "_%s group found_::_%s groups found_" => array("",""), "_%s user found_::_%s users found_" => array("",""), +"Save" => "Guardar", "Test Configuration" => "Probar configuración", "Help" => "Ayuda", "Add Server Configuration" => "Añadir Configuración del Servidor", diff --git a/apps/user_ldap/l10n/et_EE.php b/apps/user_ldap/l10n/et_EE.php index 02f1eefcd68..cf19b062dff 100644 --- a/apps/user_ldap/l10n/et_EE.php +++ b/apps/user_ldap/l10n/et_EE.php @@ -4,6 +4,7 @@ $TRANSLATIONS = array( "Failed to delete the server configuration" => "Serveri seadistuse kustutamine ebaõnnestus", "The configuration is valid and the connection could be established!" => "Seadistus on korrektne ning ühendus on olemas!", "The configuration is valid, but the Bind failed. Please check the server settings and credentials." => "Seadistus on korrektne, kuid ühendus ebaõnnestus. Palun kontrolli serveri seadeid ja ühenduseks kasutatavaid kasutajatunnuseid.", +"The configuration is invalid. Please have a look at the logs for further details." => "Seadistus on vigane. Lisainfot vaata palun logidest.", "No action specified" => "Tegevusi pole määratletud", "No configuration specified" => "Seadistust pole määratletud", "No data specified" => "Andmeid pole määratletud", @@ -26,6 +27,7 @@ $TRANSLATIONS = array( "_%s user found_::_%s users found_" => array("%s kasutaja leitud","%s kasutajat leitud"), "Invalid Host" => "Vigane server", "Could not find the desired feature" => "Ei suuda leida soovitud funktsioonaalsust", +"Save" => "Salvesta", "Test Configuration" => "Testi seadistust", "Help" => "Abiinfo", "Limit the access to %s to groups meeting this criteria:" => "Piira ligipääs %s grupile, mis sobivad kriteeriumiga:", @@ -49,7 +51,7 @@ $TRANSLATIONS = array( "For anonymous access, leave DN and Password empty." => "Anonüümseks ligipääsuks jäta DN ja parool tühjaks.", "One Base DN per line" => "Üks baas-DN rea kohta", "You can specify Base DN for users and groups in the Advanced tab" => "Sa saad kasutajate ja gruppide baas DN-i määrata lisavalikute vahekaardilt", -"Limit the access to %s to users meeting this criteria:" => "Piira ligipääs %s kasutajale, mis sobivad kriteeriumiga:", +"Limit the access to %s to users meeting this criteria:" => "Piira ligipääs %s kasutajale, kes sobivad kriteeriumiga:", "The filter specifies which LDAP users shall have access to the %s instance." => "Filter määrab millised LDAP kasutajad pääsevad ligi %s instantsile.", "users found" => "kasutajat leitud", "Back" => "Tagasi", @@ -58,11 +60,11 @@ $TRANSLATIONS = array( "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." => "<b>Hoiatus:</b>PHP LDAP moodul pole paigaldatud ning LDAP kasutamine ei ole võimalik. Palu oma süsteeihaldurit see paigaldada.", "Connection Settings" => "Ühenduse seaded", "Configuration Active" => "Seadistus aktiivne", -"When unchecked, this configuration will be skipped." => "Kui märkimata, siis seadistust ei kasutata", +"When unchecked, this configuration will be skipped." => "Kui on märkimata, siis seadistust ei kasutata.", "User Login Filter" => "Kasutajanime filter", "Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" => "Määrab sisselogimisel kasutatava filtri. %%uid asendab sisselogimistegevuses kasutajanime. Näide: \"uid=%%uid\"", "Backup (Replica) Host" => "Varuserver", -"Give an optional backup host. It must be a replica of the main LDAP/AD server." => "Lisa täiendav LDAP/AD server, mida replikeeritakse peaserveriga.", +"Give an optional backup host. It must be a replica of the main LDAP/AD server." => "Lisa valikuline varuserver. See peab olema koopia peamisest LDAP/AD serverist.", "Backup (Replica) Port" => "Varuserveri (replika) port", "Disable Main Server" => "Ära kasuta peaserverit", "Only connect to the replica server." => "Ühendu ainult replitseeriva serveriga.", @@ -71,11 +73,11 @@ $TRANSLATIONS = array( "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." => "Pole soovitatav, kasuta seda ainult testimiseks! Kui ühendus toimib ainult selle valikuga, siis impordi LDAP serveri SSL sertifikaat oma %s serverisse.", "Cache Time-To-Live" => "Puhvri iga", "in seconds. A change empties the cache." => "sekundites. Muudatus tühjendab vahemälu.", -"Directory Settings" => "Kataloogi seaded", +"Directory Settings" => "Kausta seaded", "User Display Name Field" => "Kasutaja näidatava nime väli", "The LDAP attribute to use to generate the user's display name." => "LDAP atribuut, mida kasutatakse kasutaja kuvatava nime loomiseks.", "Base User Tree" => "Baaskasutaja puu", -"One User Base DN per line" => "Üks kasutajate baas-DN rea kohta", +"One User Base DN per line" => "Üks kasutaja baas-DN rea kohta", "User Search Attributes" => "Kasutaja otsingu atribuudid", "Optional; one attribute per line" => "Valikuline; üks atribuut rea kohta", "Group Display Name Field" => "Grupi näidatava nime väli", @@ -88,7 +90,7 @@ $TRANSLATIONS = array( "Quota Field" => "Mahupiirangu atribuut", "Quota Default" => "Vaikimisi mahupiirang", "in bytes" => "baitides", -"Email Field" => "Email atribuut", +"Email Field" => "E-posti väli", "User Home Folder Naming Rule" => "Kasutaja kodukataloogi nimetamise reegel", "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." => "Kasutajanime (vaikeväärtus) kasutamiseks jäta tühjaks. Vastasel juhul määra LDAP/AD omadus.", "Internal Username" => "Sisemine kasutajanimi", diff --git a/apps/user_ldap/l10n/eu.php b/apps/user_ldap/l10n/eu.php index 1d85f7d70e7..980c5c43242 100644 --- a/apps/user_ldap/l10n/eu.php +++ b/apps/user_ldap/l10n/eu.php @@ -16,6 +16,7 @@ $TRANSLATIONS = array( "Confirm Deletion" => "Baieztatu Ezabatzea", "_%s group found_::_%s groups found_" => array("",""), "_%s user found_::_%s users found_" => array("",""), +"Save" => "Gorde", "Test Configuration" => "Egiaztatu Konfigurazioa", "Help" => "Laguntza", "Add Server Configuration" => "Gehitu Zerbitzariaren Konfigurazioa", diff --git a/apps/user_ldap/l10n/fa.php b/apps/user_ldap/l10n/fa.php index 7c37b8bf760..fb9267bbc88 100644 --- a/apps/user_ldap/l10n/fa.php +++ b/apps/user_ldap/l10n/fa.php @@ -16,6 +16,7 @@ $TRANSLATIONS = array( "Confirm Deletion" => "تایید حذف", "_%s group found_::_%s groups found_" => array(""), "_%s user found_::_%s users found_" => array(""), +"Save" => "ذخیره", "Test Configuration" => "امتحان پیکربندی", "Help" => "راهنما", "Add Server Configuration" => "افزودن پیکربندی سرور", diff --git a/apps/user_ldap/l10n/fi_FI.php b/apps/user_ldap/l10n/fi_FI.php index 4137973de68..63a8578db49 100644 --- a/apps/user_ldap/l10n/fi_FI.php +++ b/apps/user_ldap/l10n/fi_FI.php @@ -11,6 +11,7 @@ $TRANSLATIONS = array( "Confirm Deletion" => "Vahvista poisto", "_%s group found_::_%s groups found_" => array("",""), "_%s user found_::_%s users found_" => array("",""), +"Save" => "Tallenna", "Help" => "Ohje", "Host" => "Isäntä", "You can omit the protocol, except you require SSL. Then start with ldaps://" => "Voit jättää protokollan määrittämättä, paitsi kun vaadit SSL:ää. Aloita silloin ldaps://", diff --git a/apps/user_ldap/l10n/fr.php b/apps/user_ldap/l10n/fr.php index 3d51a9c91ed..d53f78eb36f 100644 --- a/apps/user_ldap/l10n/fr.php +++ b/apps/user_ldap/l10n/fr.php @@ -4,6 +4,7 @@ $TRANSLATIONS = array( "Failed to delete the server configuration" => "Échec de la suppression de la configuration du serveur", "The configuration is valid and the connection could be established!" => "La configuration est valide et la connexion peut être établie !", "The configuration is valid, but the Bind failed. Please check the server settings and credentials." => "La configuration est valide, mais le lien ne peut être établi. Veuillez vérifier les paramètres du serveur ainsi que vos identifiants de connexion.", +"The configuration is invalid. Please have a look at the logs for further details." => "La configuration est invalide. Veuillez consulter les logs pour plus de détails.", "No action specified" => "Aucune action spécifiée", "No configuration specified" => "Aucune configuration spécifiée", "No data specified" => "Aucune donnée spécifiée", @@ -26,6 +27,7 @@ $TRANSLATIONS = array( "_%s user found_::_%s users found_" => array("%s utilisateur trouvé","%s utilisateurs trouvés"), "Invalid Host" => "Hôte invalide", "Could not find the desired feature" => "Impossible de trouver la fonction souhaitée", +"Save" => "Sauvegarder", "Test Configuration" => "Tester la configuration", "Help" => "Aide", "Limit the access to %s to groups meeting this criteria:" => "Limiter l'accès à %s aux groupes respectant ce critère :", diff --git a/apps/user_ldap/l10n/gl.php b/apps/user_ldap/l10n/gl.php index 507f1e56ff8..6d7f8e334be 100644 --- a/apps/user_ldap/l10n/gl.php +++ b/apps/user_ldap/l10n/gl.php @@ -4,6 +4,7 @@ $TRANSLATIONS = array( "Failed to delete the server configuration" => "Non foi posíbel eliminar a configuración do servidor", "The configuration is valid and the connection could be established!" => "A configuración é correcta e pode estabelecerse a conexión.", "The configuration is valid, but the Bind failed. Please check the server settings and credentials." => "A configuración é correcta, mais a ligazón non. Comprobe a configuración do servidor e as credenciais.", +"The configuration is invalid. Please have a look at the logs for further details." => "A configuración non é correcta. Vexa o rexistro de ownCloud para máis detalles", "No action specified" => "Non se especificou unha acción", "No configuration specified" => "Non se especificou unha configuración", "No data specified" => "Non se especificaron datos", @@ -26,6 +27,7 @@ $TRANSLATIONS = array( "_%s user found_::_%s users found_" => array("Atopouse %s usuario","Atopáronse %s usuarios"), "Invalid Host" => "Máquina incorrecta", "Could not find the desired feature" => "Non foi posíbel atopar a función desexada", +"Save" => "Gardar", "Test Configuration" => "Probar a configuración", "Help" => "Axuda", "Limit the access to %s to groups meeting this criteria:" => "Limitar o acceso a %s aos grupos que coincidan con estes criterios:", diff --git a/apps/user_ldap/l10n/he.php b/apps/user_ldap/l10n/he.php index 17261be266b..6f838cb5d9b 100644 --- a/apps/user_ldap/l10n/he.php +++ b/apps/user_ldap/l10n/he.php @@ -10,6 +10,7 @@ $TRANSLATIONS = array( "Confirm Deletion" => "אישור המחיקה", "_%s group found_::_%s groups found_" => array("",""), "_%s user found_::_%s users found_" => array("",""), +"Save" => "שמירה", "Help" => "עזרה", "Add Server Configuration" => "הוספת הגדרות השרת", "Host" => "מארח", diff --git a/apps/user_ldap/l10n/hi.php b/apps/user_ldap/l10n/hi.php index ea41a19bfab..386134547eb 100644 --- a/apps/user_ldap/l10n/hi.php +++ b/apps/user_ldap/l10n/hi.php @@ -3,6 +3,7 @@ $TRANSLATIONS = array( "Error" => "त्रुटि", "_%s group found_::_%s groups found_" => array("",""), "_%s user found_::_%s users found_" => array("",""), +"Save" => "सहेजें", "Help" => "सहयोग", "Password" => "पासवर्ड" ); diff --git a/apps/user_ldap/l10n/hr.php b/apps/user_ldap/l10n/hr.php index d8023c5b43b..b28175994eb 100644 --- a/apps/user_ldap/l10n/hr.php +++ b/apps/user_ldap/l10n/hr.php @@ -3,6 +3,7 @@ $TRANSLATIONS = array( "Error" => "Greška", "_%s group found_::_%s groups found_" => array("","",""), "_%s user found_::_%s users found_" => array("","",""), +"Save" => "Snimi", "Help" => "Pomoć", "Password" => "Lozinka", "Back" => "Natrag" diff --git a/apps/user_ldap/l10n/hu_HU.php b/apps/user_ldap/l10n/hu_HU.php index 92f2b5d5674..498221632f0 100644 --- a/apps/user_ldap/l10n/hu_HU.php +++ b/apps/user_ldap/l10n/hu_HU.php @@ -26,6 +26,7 @@ $TRANSLATIONS = array( "_%s user found_::_%s users found_" => array("%s felhasználó van","%s felhasználó van"), "Invalid Host" => "Érvénytelen gépnév", "Could not find the desired feature" => "A kívánt funkció nem található", +"Save" => "Mentés", "Test Configuration" => "A beállítások tesztelése", "Help" => "Súgó", "Limit the access to %s to groups meeting this criteria:" => "Korlátozzuk %s elérését a következő feltételeknek megfelelő csoportokra:", diff --git a/apps/user_ldap/l10n/hy.php b/apps/user_ldap/l10n/hy.php index 3a1e002311c..805020b059c 100644 --- a/apps/user_ldap/l10n/hy.php +++ b/apps/user_ldap/l10n/hy.php @@ -1,6 +1,7 @@ <?php $TRANSLATIONS = array( "_%s group found_::_%s groups found_" => array("",""), -"_%s user found_::_%s users found_" => array("","") +"_%s user found_::_%s users found_" => array("",""), +"Save" => "Պահպանել" ); $PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/user_ldap/l10n/ia.php b/apps/user_ldap/l10n/ia.php index ced826ac6d8..4a23d5860c4 100644 --- a/apps/user_ldap/l10n/ia.php +++ b/apps/user_ldap/l10n/ia.php @@ -3,6 +3,7 @@ $TRANSLATIONS = array( "Error" => "Error", "_%s group found_::_%s groups found_" => array("",""), "_%s user found_::_%s users found_" => array("",""), +"Save" => "Salveguardar", "Help" => "Adjuta", "Password" => "Contrasigno", "Back" => "Retro" diff --git a/apps/user_ldap/l10n/id.php b/apps/user_ldap/l10n/id.php index 3e8d47ef801..11e43d22206 100644 --- a/apps/user_ldap/l10n/id.php +++ b/apps/user_ldap/l10n/id.php @@ -16,6 +16,7 @@ $TRANSLATIONS = array( "Confirm Deletion" => "Konfirmasi Penghapusan", "_%s group found_::_%s groups found_" => array(""), "_%s user found_::_%s users found_" => array(""), +"Save" => "Simpan", "Test Configuration" => "Uji Konfigurasi", "Help" => "Bantuan", "Add Server Configuration" => "Tambah Konfigurasi Server", diff --git a/apps/user_ldap/l10n/is.php b/apps/user_ldap/l10n/is.php index 0fdd6ca9c43..e146c93cb81 100644 --- a/apps/user_ldap/l10n/is.php +++ b/apps/user_ldap/l10n/is.php @@ -4,6 +4,7 @@ $TRANSLATIONS = array( "Error" => "Villa", "_%s group found_::_%s groups found_" => array("",""), "_%s user found_::_%s users found_" => array("",""), +"Save" => "Vista", "Test Configuration" => "Prúfa uppsetningu", "Help" => "Hjálp", "Host" => "Netþjónn", diff --git a/apps/user_ldap/l10n/it.php b/apps/user_ldap/l10n/it.php index 9825832f3d8..97ca14e0a85 100644 --- a/apps/user_ldap/l10n/it.php +++ b/apps/user_ldap/l10n/it.php @@ -27,6 +27,7 @@ $TRANSLATIONS = array( "_%s user found_::_%s users found_" => array("%s utente trovato","%s utenti trovati"), "Invalid Host" => "Host non valido", "Could not find the desired feature" => "Impossibile trovare la funzionalità desiderata", +"Save" => "Salva", "Test Configuration" => "Prova configurazione", "Help" => "Aiuto", "Limit the access to %s to groups meeting this criteria:" => "Limita l'accesso a %s ai gruppi che verificano questi criteri:", diff --git a/apps/user_ldap/l10n/ja_JP.php b/apps/user_ldap/l10n/ja_JP.php index 34bcbb22149..1c94743af49 100644 --- a/apps/user_ldap/l10n/ja_JP.php +++ b/apps/user_ldap/l10n/ja_JP.php @@ -26,6 +26,7 @@ $TRANSLATIONS = array( "_%s user found_::_%s users found_" => array("%s ユーザが見つかりました"), "Invalid Host" => "無効なホスト", "Could not find the desired feature" => "望ましい機能は見つかりませんでした", +"Save" => "保存", "Test Configuration" => "設定をテスト", "Help" => "ヘルプ", "Limit the access to %s to groups meeting this criteria:" => "この基準に合致するグループに %s へのアクセスを制限:", diff --git a/apps/user_ldap/l10n/ka_GE.php b/apps/user_ldap/l10n/ka_GE.php index 6d79e80c15a..33483681044 100644 --- a/apps/user_ldap/l10n/ka_GE.php +++ b/apps/user_ldap/l10n/ka_GE.php @@ -16,6 +16,7 @@ $TRANSLATIONS = array( "Confirm Deletion" => "წაშლის დადასტურება", "_%s group found_::_%s groups found_" => array(""), "_%s user found_::_%s users found_" => array(""), +"Save" => "შენახვა", "Test Configuration" => "კავშირის ტესტირება", "Help" => "დახმარება", "Add Server Configuration" => "სერვერის პარამეტრების დამატება", diff --git a/apps/user_ldap/l10n/ko.php b/apps/user_ldap/l10n/ko.php index a9dedd26716..423f094e239 100644 --- a/apps/user_ldap/l10n/ko.php +++ b/apps/user_ldap/l10n/ko.php @@ -8,6 +8,7 @@ $TRANSLATIONS = array( "Connection test failed" => "연결 시험 실패", "_%s group found_::_%s groups found_" => array(""), "_%s user found_::_%s users found_" => array(""), +"Save" => "저장", "Help" => "도움말", "Host" => "호스트", "You can omit the protocol, except you require SSL. Then start with ldaps://" => "SSL을 사용하는 경우가 아니라면 프로토콜을 입력하지 않아도 됩니다. SSL을 사용하려면 ldaps://를 입력하십시오.", diff --git a/apps/user_ldap/l10n/ku_IQ.php b/apps/user_ldap/l10n/ku_IQ.php index 6e84a546a55..7d3b22f8494 100644 --- a/apps/user_ldap/l10n/ku_IQ.php +++ b/apps/user_ldap/l10n/ku_IQ.php @@ -4,6 +4,7 @@ $TRANSLATIONS = array( "Error" => "ههڵه", "_%s group found_::_%s groups found_" => array("",""), "_%s user found_::_%s users found_" => array("",""), +"Save" => "پاشکهوتکردن", "Help" => "یارمەتی", "Password" => "وشەی تێپەربو" ); diff --git a/apps/user_ldap/l10n/lb.php b/apps/user_ldap/l10n/lb.php index b89a2ac8b61..c6fdc003548 100644 --- a/apps/user_ldap/l10n/lb.php +++ b/apps/user_ldap/l10n/lb.php @@ -4,7 +4,9 @@ $TRANSLATIONS = array( "Error" => "Fehler", "_%s group found_::_%s groups found_" => array("",""), "_%s user found_::_%s users found_" => array("",""), +"Save" => "Späicheren", "Help" => "Hëllef", +"Host" => "Host", "Password" => "Passwuert", "Back" => "Zeréck", "Continue" => "Weider" diff --git a/apps/user_ldap/l10n/lt_LT.php b/apps/user_ldap/l10n/lt_LT.php index ee8bb28425c..4e5a562d7fd 100644 --- a/apps/user_ldap/l10n/lt_LT.php +++ b/apps/user_ldap/l10n/lt_LT.php @@ -16,6 +16,7 @@ $TRANSLATIONS = array( "Confirm Deletion" => "Patvirtinkite trynimą", "_%s group found_::_%s groups found_" => array("","",""), "_%s user found_::_%s users found_" => array("","",""), +"Save" => "Išsaugoti", "Test Configuration" => "Bandyti konfigūraciją", "Help" => "Pagalba", "Add Server Configuration" => "Pridėti serverio konfigūraciją", diff --git a/apps/user_ldap/l10n/lv.php b/apps/user_ldap/l10n/lv.php index 7ab2210f79d..0cbf7415d33 100644 --- a/apps/user_ldap/l10n/lv.php +++ b/apps/user_ldap/l10n/lv.php @@ -15,6 +15,7 @@ $TRANSLATIONS = array( "Confirm Deletion" => "Apstiprināt dzēšanu", "_%s group found_::_%s groups found_" => array("","",""), "_%s user found_::_%s users found_" => array("","",""), +"Save" => "Saglabāt", "Test Configuration" => "Testa konfigurācija", "Help" => "Palīdzība", "Add Server Configuration" => "Pievienot servera konfigurāciju", diff --git a/apps/user_ldap/l10n/mk.php b/apps/user_ldap/l10n/mk.php index 4b8055324d6..fcbc01f137b 100644 --- a/apps/user_ldap/l10n/mk.php +++ b/apps/user_ldap/l10n/mk.php @@ -1,12 +1,19 @@ <?php $TRANSLATIONS = array( "Deletion failed" => "Бришењето е неуспешно", +"Keep settings?" => "Да ги сочувам нагодувањата?", +"Cannot add server configuration" => "Не можам да ја додадам конфигурацијата на серверот", "Error" => "Грешка", +"Connection test succeeded" => "Тестот за поврзување е успешен", +"Connection test failed" => "Тестот за поврзување не е успешен", +"Confirm Deletion" => "Потврдете го бришењето", "_%s group found_::_%s groups found_" => array("",""), "_%s user found_::_%s users found_" => array("",""), +"Save" => "Сними", "Help" => "Помош", "Host" => "Домаќин", "You can omit the protocol, except you require SSL. Then start with ldaps://" => "Може да го скокнете протколот освен ако не ви треба SSL. Тогаш ставете ldaps://", +"Port" => "Порта", "Password" => "Лозинка", "Back" => "Назад", "Continue" => "Продолжи" diff --git a/apps/user_ldap/l10n/ms_MY.php b/apps/user_ldap/l10n/ms_MY.php index b6a8ede78ee..7010e8a8f50 100644 --- a/apps/user_ldap/l10n/ms_MY.php +++ b/apps/user_ldap/l10n/ms_MY.php @@ -4,6 +4,7 @@ $TRANSLATIONS = array( "Error" => "Ralat", "_%s group found_::_%s groups found_" => array(""), "_%s user found_::_%s users found_" => array(""), +"Save" => "Simpan", "Help" => "Bantuan", "Password" => "Kata laluan", "Back" => "Kembali" diff --git a/apps/user_ldap/l10n/nb_NO.php b/apps/user_ldap/l10n/nb_NO.php index 6d3c7e6aa42..42ff76f04a0 100644 --- a/apps/user_ldap/l10n/nb_NO.php +++ b/apps/user_ldap/l10n/nb_NO.php @@ -16,6 +16,7 @@ $TRANSLATIONS = array( "Confirm Deletion" => "Bekreft sletting", "_%s group found_::_%s groups found_" => array("",""), "_%s user found_::_%s users found_" => array("",""), +"Save" => "Lagre", "Help" => "Hjelp", "Add Server Configuration" => "Legg til tjener-konfigurasjon", "Host" => "Tjener", diff --git a/apps/user_ldap/l10n/nl.php b/apps/user_ldap/l10n/nl.php index e2b6c04c73b..9acd9c088c8 100644 --- a/apps/user_ldap/l10n/nl.php +++ b/apps/user_ldap/l10n/nl.php @@ -4,6 +4,7 @@ $TRANSLATIONS = array( "Failed to delete the server configuration" => "Verwijderen serverconfiguratie mislukt", "The configuration is valid and the connection could be established!" => "De configuratie is geldig en de verbinding is geslaagd!", "The configuration is valid, but the Bind failed. Please check the server settings and credentials." => "De configuratie is geldig, maar Bind mislukte. Controleer de serverinstellingen en inloggegevens.", +"The configuration is invalid. Please have a look at the logs for further details." => "De configuratie is ongeldig. Bekijk de logbestanden voor meer details.", "No action specified" => "Geen actie opgegeven", "No configuration specified" => "Geen configuratie opgegeven", "No data specified" => "Geen gegevens verstrekt", @@ -26,6 +27,7 @@ $TRANSLATIONS = array( "_%s user found_::_%s users found_" => array("%s gebruiker gevonden","%s gebruikers gevonden"), "Invalid Host" => "Ongeldige server", "Could not find the desired feature" => "Kon de gewenste functie niet vinden", +"Save" => "Bewaren", "Test Configuration" => "Test configuratie", "Help" => "Help", "Limit the access to %s to groups meeting this criteria:" => "Beperk toegang tot %s tot groepen die voldoen aan deze criteria:", diff --git a/apps/user_ldap/l10n/nn_NO.php b/apps/user_ldap/l10n/nn_NO.php index be2ce476137..c8b7ec091b6 100644 --- a/apps/user_ldap/l10n/nn_NO.php +++ b/apps/user_ldap/l10n/nn_NO.php @@ -5,6 +5,7 @@ $TRANSLATIONS = array( "Select groups" => "Vel grupper", "_%s group found_::_%s groups found_" => array("",""), "_%s user found_::_%s users found_" => array("",""), +"Save" => "Lagra", "Help" => "Hjelp", "Host" => "Tenar", "Password" => "Passord", diff --git a/apps/user_ldap/l10n/oc.php b/apps/user_ldap/l10n/oc.php index 4bffe766a0b..3b3e8365a65 100644 --- a/apps/user_ldap/l10n/oc.php +++ b/apps/user_ldap/l10n/oc.php @@ -4,6 +4,7 @@ $TRANSLATIONS = array( "Error" => "Error", "_%s group found_::_%s groups found_" => array("",""), "_%s user found_::_%s users found_" => array("",""), +"Save" => "Enregistra", "Help" => "Ajuda", "Password" => "Senhal" ); diff --git a/apps/user_ldap/l10n/pl.php b/apps/user_ldap/l10n/pl.php index 39e43c0a6d1..945f72e0537 100644 --- a/apps/user_ldap/l10n/pl.php +++ b/apps/user_ldap/l10n/pl.php @@ -18,6 +18,7 @@ $TRANSLATIONS = array( "Confirm Deletion" => "Potwierdź usunięcie", "_%s group found_::_%s groups found_" => array("","",""), "_%s user found_::_%s users found_" => array("","",""), +"Save" => "Zapisz", "Test Configuration" => "Konfiguracja testowa", "Help" => "Pomoc", "Add Server Configuration" => "Dodaj konfigurację servera", diff --git a/apps/user_ldap/l10n/pt_BR.php b/apps/user_ldap/l10n/pt_BR.php index f30fe35b15b..cf047b2c88c 100644 --- a/apps/user_ldap/l10n/pt_BR.php +++ b/apps/user_ldap/l10n/pt_BR.php @@ -4,6 +4,7 @@ $TRANSLATIONS = array( "Failed to delete the server configuration" => "Falha ao deletar a configuração do servidor", "The configuration is valid and the connection could be established!" => "A configuração é válida e a conexão foi estabelecida!", "The configuration is valid, but the Bind failed. Please check the server settings and credentials." => "A configuração é válida, mas o Bind falhou. Confira as configurações do servidor e as credenciais.", +"The configuration is invalid. Please have a look at the logs for further details." => "Configuração inválida. Por favor, dê uma olhada nos logs para mais detalhes.", "No action specified" => "Nenhuma ação especificada", "No configuration specified" => "Nenhuma configuração especificada", "No data specified" => "Não há dados especificados", @@ -26,6 +27,7 @@ $TRANSLATIONS = array( "_%s user found_::_%s users found_" => array("usuário %s encontrado","usuários %s encontrados"), "Invalid Host" => "Host inválido", "Could not find the desired feature" => "Não foi possível encontrar a função desejada", +"Save" => "Guardar", "Test Configuration" => "Teste de Configuração", "Help" => "Ajuda", "Limit the access to %s to groups meeting this criteria:" => "Limitar o acesso a %s para grupos que coincidam com estes critérios:", diff --git a/apps/user_ldap/l10n/pt_PT.php b/apps/user_ldap/l10n/pt_PT.php index b9332990088..78516929e1a 100644 --- a/apps/user_ldap/l10n/pt_PT.php +++ b/apps/user_ldap/l10n/pt_PT.php @@ -18,6 +18,7 @@ $TRANSLATIONS = array( "Confirm Deletion" => "Confirmar a operação de apagar", "_%s group found_::_%s groups found_" => array("",""), "_%s user found_::_%s users found_" => array("",""), +"Save" => "Guardar", "Test Configuration" => "Testar a configuração", "Help" => "Ajuda", "Add Server Configuration" => "Adicionar configurações do servidor", diff --git a/apps/user_ldap/l10n/ro.php b/apps/user_ldap/l10n/ro.php index 9454aa52465..34c1809ca11 100644 --- a/apps/user_ldap/l10n/ro.php +++ b/apps/user_ldap/l10n/ro.php @@ -5,6 +5,7 @@ $TRANSLATIONS = array( "Error" => "Eroare", "_%s group found_::_%s groups found_" => array("","",""), "_%s user found_::_%s users found_" => array("","",""), +"Save" => "Salvează", "Help" => "Ajutor", "Host" => "Gazdă", "You can omit the protocol, except you require SSL. Then start with ldaps://" => "Puteți omite protocolul, decât dacă folosiți SSL. Atunci se începe cu ldaps://", diff --git a/apps/user_ldap/l10n/ru.php b/apps/user_ldap/l10n/ru.php index eed2814857f..f908fa3cc70 100644 --- a/apps/user_ldap/l10n/ru.php +++ b/apps/user_ldap/l10n/ru.php @@ -1,9 +1,10 @@ <?php $TRANSLATIONS = array( -"Failed to clear the mappings." => "Не удалось очистить соотвествия.", +"Failed to clear the mappings." => "Не удалось очистить соответствия.", "Failed to delete the server configuration" => "Не удалось удалить конфигурацию сервера", "The configuration is valid and the connection could be established!" => "Конфигурация правильная и подключение может быть установлено!", "The configuration is valid, but the Bind failed. Please check the server settings and credentials." => "Конфигурация верна, но операция подключения завершилась неудачно. Пожалуйста, проверьте настройки сервера и учетные данные.", +"The configuration is invalid. Please have a look at the logs for further details." => "Конфигурация недействительна. Пожалуйста, просмотрите логи для уточнения деталей.", "No action specified" => "Действие не указано", "No configuration specified" => "Конфигурация не создана", "No data specified" => "Нет данных", @@ -15,60 +16,61 @@ $TRANSLATIONS = array( "mappings cleared" => "Соответствия очищены", "Success" => "Успешно", "Error" => "Ошибка", -"Select groups" => "Выбрать группы", -"Select object classes" => "Выберите классы объекта", +"Select groups" => "Выберите группы", +"Select object classes" => "Выберите объектные классы", "Select attributes" => "Выберите атрибуты", "Connection test succeeded" => "Проверка соединения удалась", "Connection test failed" => "Проверка соединения не удалась", "Do you really want to delete the current Server Configuration?" => "Вы действительно хотите удалить существующую конфигурацию сервера?", "Confirm Deletion" => "Подтверждение удаления", -"_%s group found_::_%s groups found_" => array("%s гурппа найдена","%s группы найдены","%s групп найдено"), +"_%s group found_::_%s groups found_" => array("%s группа найдена","%s группы найдены","%s групп найдено"), "_%s user found_::_%s users found_" => array("%s пользователь найден","%s пользователя найдено","%s пользователей найдено"), "Invalid Host" => "Неверный сервер", "Could not find the desired feature" => "Не могу найти требуемой функциональности", -"Test Configuration" => "Тестовая конфигурация", +"Save" => "Сохранить", +"Test Configuration" => "Проверить конфигурацию", "Help" => "Помощь", -"Limit the access to %s to groups meeting this criteria:" => "Ограничить доступ к %s группам удовлетворяющим этому критерию:", -"only those object classes:" => "только эти классы объекта", +"Limit the access to %s to groups meeting this criteria:" => "Ограничить доступ к %s группам, удовлетворяющим этому критерию:", +"only those object classes:" => "только эти объектные классы", "only from those groups:" => "только из этих групп", "Edit raw filter instead" => "Редактировать исходный фильтр", "Raw LDAP filter" => "Исходный LDAP фильтр", -"The filter specifies which LDAP groups shall have access to the %s instance." => "Этот фильтр определяет какие LDAP группы должны иметь доступ к %s.", +"The filter specifies which LDAP groups shall have access to the %s instance." => "Этот фильтр определяет, какие LDAP группы должны иметь доступ к %s.", "groups found" => "групп найдено", -"What attribute shall be used as login name:" => "Какой аттибут должен быть использован для логина:", +"What attribute shall be used as login name:" => "Какой атрибут должен быть использован для логина:", "LDAP Username:" => "Имя пользователя LDAP", "LDAP Email Address:" => "LDAP адрес электронной почты:", -"Other Attributes:" => "Другие аттрибуты:", +"Other Attributes:" => "Другие атрибуты:", "Add Server Configuration" => "Добавить конфигурацию сервера", "Host" => "Сервер", "You can omit the protocol, except you require SSL. Then start with ldaps://" => "Можно опустить протокол, за исключением того, когда вам требуется SSL. Тогда начните с ldaps :/ /", "Port" => "Порт", "User DN" => "DN пользователя", -"The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." => "DN-клиента пользователя, с которым связывают должно быть заполнено, например, uid=агент, dc=пример, dc=com. Для анонимного доступа, оставьте DN и пароль пустыми.", +"The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." => "DN пользователя, под которым выполняется подключение, например, uid=agent,dc=example,dc=com. Для анонимного доступа оставьте DN и пароль пустыми.", "Password" => "Пароль", "For anonymous access, leave DN and Password empty." => "Для анонимного доступа оставьте DN и пароль пустыми.", -"One Base DN per line" => "По одному базовому DN в строке.", +"One Base DN per line" => "По одной базе поиска (Base DN) в строке.", "You can specify Base DN for users and groups in the Advanced tab" => "Вы можете задать Base DN для пользователей и групп на вкладке \"Расширенное\"", -"Limit the access to %s to users meeting this criteria:" => "Ограничить доступ к %s пользователям удовлетворяющим этому критерию:", -"The filter specifies which LDAP users shall have access to the %s instance." => "Этот фильтр указывает какие LDAP пользователи должны иметь доступ к %s.", +"Limit the access to %s to users meeting this criteria:" => "Ограничить доступ к %s пользователям, удовлетворяющим этому критерию:", +"The filter specifies which LDAP users shall have access to the %s instance." => "Этот фильтр указывает, какие пользователи LDAP должны иметь доступ к %s.", "users found" => "пользователей найдено", "Back" => "Назад", "Continue" => "Продолжить", -"<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." => "<b>Предупреждение:</b> Приложения user_ldap и user_webdavauth не совместимы. Вы можете наблюдать некорректное поведение. Пожалуйста попросите Вашего системного администратора отключить одно из них.", +"<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." => "<b>Предупреждение:</b> Приложения user_ldap и user_webdavauth несовместимы. Вы можете наблюдать некорректное поведение. Пожалуйста, попросите вашего системного администратора отключить одно из них.", "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." => "<b>Внимание:</b> Модуль LDAP для PHP не установлен, бэкенд не будет работать. Пожалуйста, попросите вашего системного администратора его установить. ", "Connection Settings" => "Настройки подключения", "Configuration Active" => "Конфигурация активна", "When unchecked, this configuration will be skipped." => "Когда галочка снята, эта конфигурация будет пропущена.", -"User Login Filter" => "Фильтр входа пользователей", +"User Login Filter" => "Фильтр учетных записей", "Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" => "Определяет фильтр для применения при попытке входа. %%uid заменяет имя пользователя при входе в систему. Например: \"uid=%%uid\"", "Backup (Replica) Host" => "Адрес резервного сервера", "Give an optional backup host. It must be a replica of the main LDAP/AD server." => "Укажите дополнительный резервный сервер. Он должен быть репликой главного LDAP/AD сервера.", "Backup (Replica) Port" => "Порт резервного сервера", -"Disable Main Server" => "Отключение главного сервера", -"Only connect to the replica server." => "Только подключение к серверу реплик.", +"Disable Main Server" => "Отключить главный сервер", +"Only connect to the replica server." => "Подключаться только к серверу-реплике.", "Case insensitve LDAP server (Windows)" => "Нечувствительный к регистру сервер LDAP (Windows)", "Turn off SSL certificate validation." => "Отключить проверку сертификата SSL.", -"Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." => "Не рекомендуется, используйте только в режиме тестирования! Если соединение работает только с этой опцией, импортируйте на ваш %s сервер сертификат SSL сервера LDAP.", +"Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." => "Не рекомендуется, используйте только в режиме тестирования! Если соединение работает только с этой опцией, импортируйте на ваш %s сервер SSL-сертификат сервера LDAP.", "Cache Time-To-Live" => "Кэш времени жизни", "in seconds. A change empties the cache." => "в секундах. Изменение очистит кэш.", "Directory Settings" => "Настройки каталога", @@ -76,8 +78,8 @@ $TRANSLATIONS = array( "The LDAP attribute to use to generate the user's display name." => "Атрибут LDAP, который используется для генерации отображаемого имени пользователя.", "Base User Tree" => "База пользовательского дерева", "One User Base DN per line" => "По одной базовому DN пользователей в строке.", -"User Search Attributes" => "Поисковые атрибуты пользователя", -"Optional; one attribute per line" => "Опционально; один атрибут на линию", +"User Search Attributes" => "Атрибуты поиска пользоватетелей", +"Optional; one attribute per line" => "Опционально; один атрибут в строке", "Group Display Name Field" => "Поле отображаемого имени группы", "The LDAP attribute to use to generate the groups's display name." => "Атрибут LDAP, который используется для генерации отображаемого имени группы.", "Base Group Tree" => "База группового дерева", @@ -85,21 +87,21 @@ $TRANSLATIONS = array( "Group Search Attributes" => "Атрибуты поиска для группы", "Group-Member association" => "Ассоциация Группа-Участник", "Special Attributes" => "Специальные атрибуты", -"Quota Field" => "Поле квота", +"Quota Field" => "Поле квоты", "Quota Default" => "Квота по умолчанию", "in bytes" => "в байтах", -"Email Field" => "Поле адресса эллектронной почты", -"User Home Folder Naming Rule" => "Правило именования Домашней Папки Пользователя", -"Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." => "Оставьте имя пользователя пустым (по умолчанию). Иначе укажите атрибут LDAP/AD.", +"Email Field" => "Поле адреса электронной почты", +"User Home Folder Naming Rule" => "Правило именования домашней папки пользователя", +"Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." => "Оставьте пустым для использования имени пользователя (по умолчанию). Иначе укажите атрибут LDAP/AD.", "Internal Username" => "Внутреннее имя пользователя", -"By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. To achieve a similar behavior as before ownCloud 5 enter the user display name attribute in the following field. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." => "По-умолчанию внутреннее имя пользователя будет создано из атрибута UUID. Таким образом имя пользователя становится уникальным и не требует конвертации символов. Внутреннее имя пользователя может состоять только из следующих символов: [ a-zA-Z0-9_.@- ]. Остальные символы замещаются соответствиями из таблицы ASCII или же просто пропускаются. При совпадении к имени будет добавлено число. Внутреннее имя пользователя используется для внутренней идентификации пользователя. Также оно является именем по-умолчанию для папки пользователя в ownCloud. Оно также портом для удаленных ссылок, к примеру, для всех сервисов *DAV. С помощию данной настройки можно изменить поведение по-умолчанию. Чтобы достичь поведения, как было настроено до изменения, ownCloud 5 выводит атрибут имени пользователя в этом поле. Оставьте его пустым для режима по-умолчанию. Изменения будут иметь эффект только для новых подключенных (добавленных) пользователей LDAP.", -"Internal Username Attribute:" => "Аттрибут для внутреннего имени:", +"By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. To achieve a similar behavior as before ownCloud 5 enter the user display name attribute in the following field. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." => "По умолчанию внутреннее имя пользователя будет создано из атрибута UUID. Таким образом имя пользователя становится уникальным и не требует конвертации символов. Внутреннее имя пользователя может состоять только из следующих символов: [ a-zA-Z0-9_.@- ]. Остальные символы замещаются соответствиями из таблицы ASCII или же просто пропускаются. При совпадении к имени будет добавлено или увеличено число. Внутреннее имя пользователя используется для внутренней идентификации пользователя. Также оно является именем по умолчанию для папки пользователя в ownCloud. Оно также является частью URL, к примеру, для всех сервисов *DAV. С помощью данной настройки можно изменить поведение по умолчанию. Чтобы достичь поведения, как было до ownCloud 5, введите атрибут отображаемого имени пользователя в этом поле. Оставьте его пустым для режима по умолчанию. Изменения будут иметь эффект только для новых подключенных (добавленных) пользователей LDAP.", +"Internal Username Attribute:" => "Атрибут для внутреннего имени:", "Override UUID detection" => "Переопределить нахождение UUID", -"By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." => "По-умолчанию, ownCloud определяет атрибут UUID автоматически. Этот атрибут используется для того, чтобы достоверно индентифицировать пользователей и группы LDAP. Также, на основании атрибута UUID создается внутреннее имя пользователя, если выше не указано иначе. Вы можете переопределить эту настройку и указать свой атрибут по выбору. Вы должны удостовериться, что выбранный вами атрибут может быть выбран для пользователей и групп, а также то, что он уникальный. Оставьте поле пустым для поведения по-умолчанию. Изменения вступят в силу только для новых подключенных (добавленных) пользователей и групп LDAP.", -"UUID Attribute for Users:" => "UUID Аттрибуты для Пользователей:", -"UUID Attribute for Groups:" => "UUID Аттрибуты для Групп:", +"By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." => "По умолчанию ownCloud определяет атрибут UUID автоматически. Этот атрибут используется для того, чтобы достоверно индентифицировать пользователей и группы LDAP. Также на основании атрибута UUID создается внутреннее имя пользователя, если выше не указано иначе. Вы можете переопределить эту настройку и указать свой атрибут по выбору. Вы должны удостовериться, что выбранный вами атрибут может быть выбран для пользователей и групп, а также то, что он уникальный. Оставьте поле пустым для поведения по умолчанию. Изменения вступят в силу только для новых подключенных (добавленных) пользователей и групп LDAP.", +"UUID Attribute for Users:" => "UUID-атрибуты для пользователей:", +"UUID Attribute for Groups:" => "UUID-атрибуты для групп:", "Username-LDAP User Mapping" => "Соответствия Имя-Пользователь LDAP", -"Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have a internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." => "ownCloud использует имена пользователей для хранения и назначения метаданных. Для точной идентификации и распознавания пользователей, каждый пользователь LDAP будет иметь свое внутреннее имя пользователя. Это требует привязки имени пользователя ownCloud к пользователю LDAP. При создании имя пользователя назначается идентификатору UUID пользователя LDAP. Помимо этого кешируется доменное имя (DN) для уменьшения числа обращений к LDAP, однако оно не используется для идентификации. Если доменное имя было изменено, об этом станет известно ownCloud. Внутреннее имя ownCloud используется повсеместно в ownCloud. После сброса привязок в базе могут сохраниться остатки старой информации. Сброс привязок не привязан к конфигурации, он повлияет на все LDAP подключения! Ни в коем случае не рекомендуется сбрасывать привязки если система уже находится в эксплуатации, только на этапе тестирования.", +"Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have a internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." => "ownCloud использует имена пользователей для хранения и назначения метаданных. Для точной идентификации и распознавания пользователей, каждый пользователь LDAP будет иметь свое внутреннее имя пользователя. Это требует привязки имени пользователя ownCloud к пользователю LDAP. При создании имя пользователя назначается идентификатору UUID пользователя LDAP. Помимо этого кешируется различающееся имя (DN) для уменьшения числа обращений к LDAP, однако оно не используется для идентификации. Если различающееся имя было изменено, об этом станет известно ownCloud. Внутреннее имя ownCloud используется повсеместно в ownCloud. После сброса привязок в базе могут сохраниться остатки старой информации. Сброс привязок не привязан к конфигурации, он повлияет на все LDAP-подключения! Ни в коем случае не рекомендуется сбрасывать привязки, если система уже находится в эксплуатации, только на этапе тестирования.", "Clear Username-LDAP User Mapping" => "Очистить соответствия Имя-Пользователь LDAP", "Clear Groupname-LDAP Group Mapping" => "Очистить соответствия Группа-Группа LDAP" ); diff --git a/apps/user_ldap/l10n/ru_RU.php b/apps/user_ldap/l10n/ru_RU.php index ca3bfec61bd..696e44a5bb5 100644 --- a/apps/user_ldap/l10n/ru_RU.php +++ b/apps/user_ldap/l10n/ru_RU.php @@ -4,6 +4,7 @@ $TRANSLATIONS = array( "Select groups" => "Выбрать группы", "_%s group found_::_%s groups found_" => array("","",""), "_%s user found_::_%s users found_" => array("","",""), +"Save" => "Сохранить", "Help" => "Помощь", "Password" => "Пароль", "Back" => "Назад" diff --git a/apps/user_ldap/l10n/si_LK.php b/apps/user_ldap/l10n/si_LK.php index 9b427d13bb1..1672daf7eb4 100644 --- a/apps/user_ldap/l10n/si_LK.php +++ b/apps/user_ldap/l10n/si_LK.php @@ -5,6 +5,7 @@ $TRANSLATIONS = array( "Error" => "දෝෂයක්", "_%s group found_::_%s groups found_" => array("",""), "_%s user found_::_%s users found_" => array("",""), +"Save" => "සුරකින්න", "Help" => "උදව්", "Host" => "සත්කාරකය", "You can omit the protocol, except you require SSL. Then start with ldaps://" => "SSL අවශ්යය වන විට පමණක් හැර, අන් අවස්ථාවන්හිදී ප්රොටොකෝලය අත් හැරිය හැක. භාවිතා කරන විට ldaps:// ලෙස ආරම්භ කරන්න", diff --git a/apps/user_ldap/l10n/sk_SK.php b/apps/user_ldap/l10n/sk_SK.php index c716dbb8d11..5367abca9a8 100644 --- a/apps/user_ldap/l10n/sk_SK.php +++ b/apps/user_ldap/l10n/sk_SK.php @@ -18,6 +18,7 @@ $TRANSLATIONS = array( "Confirm Deletion" => "Potvrdiť vymazanie", "_%s group found_::_%s groups found_" => array("","",""), "_%s user found_::_%s users found_" => array("","",""), +"Save" => "Uložiť", "Test Configuration" => "Test nastavenia", "Help" => "Pomoc", "Add Server Configuration" => "Pridať nastavenia servera.", diff --git a/apps/user_ldap/l10n/sl.php b/apps/user_ldap/l10n/sl.php index 381d13a911a..7eefc34e433 100644 --- a/apps/user_ldap/l10n/sl.php +++ b/apps/user_ldap/l10n/sl.php @@ -18,6 +18,7 @@ $TRANSLATIONS = array( "Confirm Deletion" => "Potrdi brisanje", "_%s group found_::_%s groups found_" => array("","","",""), "_%s user found_::_%s users found_" => array("","","",""), +"Save" => "Shrani", "Test Configuration" => "Preizkusne nastavitve", "Help" => "Pomoč", "Add Server Configuration" => "Dodaj nastavitve strežnika", diff --git a/apps/user_ldap/l10n/sq.php b/apps/user_ldap/l10n/sq.php index 322b56acbb8..ed19a49363e 100644 --- a/apps/user_ldap/l10n/sq.php +++ b/apps/user_ldap/l10n/sq.php @@ -17,6 +17,7 @@ $TRANSLATIONS = array( "Confirm Deletion" => "Konfirmoni Fshirjen", "_%s group found_::_%s groups found_" => array("",""), "_%s user found_::_%s users found_" => array("",""), +"Save" => "Ruaj", "Test Configuration" => "Provoni konfigurimet", "Help" => "Ndihmë", "Add Server Configuration" => "Shtoni konfigurimet e serverit", diff --git a/apps/user_ldap/l10n/sr.php b/apps/user_ldap/l10n/sr.php index d79f6bf93f1..f44730e71a1 100644 --- a/apps/user_ldap/l10n/sr.php +++ b/apps/user_ldap/l10n/sr.php @@ -4,6 +4,7 @@ $TRANSLATIONS = array( "Error" => "Грешка", "_%s group found_::_%s groups found_" => array("","",""), "_%s user found_::_%s users found_" => array("","",""), +"Save" => "Сачувај", "Help" => "Помоћ", "Host" => "Домаћин", "You can omit the protocol, except you require SSL. Then start with ldaps://" => "Можете да изоставите протокол, осим ако захтевате SSL. У том случају почните са ldaps://.", diff --git a/apps/user_ldap/l10n/sr@latin.php b/apps/user_ldap/l10n/sr@latin.php index 91e88b65381..e3023996ad3 100644 --- a/apps/user_ldap/l10n/sr@latin.php +++ b/apps/user_ldap/l10n/sr@latin.php @@ -3,6 +3,7 @@ $TRANSLATIONS = array( "Error" => "Greška", "_%s group found_::_%s groups found_" => array("","",""), "_%s user found_::_%s users found_" => array("","",""), +"Save" => "Snimi", "Help" => "Pomoć", "Password" => "Lozinka" ); diff --git a/apps/user_ldap/l10n/sv.php b/apps/user_ldap/l10n/sv.php index 072ed3b7d82..2a1a6e46e03 100644 --- a/apps/user_ldap/l10n/sv.php +++ b/apps/user_ldap/l10n/sv.php @@ -26,6 +26,7 @@ $TRANSLATIONS = array( "_%s user found_::_%s users found_" => array("%s användare hittad","%s användare hittade"), "Invalid Host" => "Felaktig Host", "Could not find the desired feature" => "Det gick inte hitta den önskade funktionen", +"Save" => "Spara", "Test Configuration" => "Testa konfigurationen", "Help" => "Hjälp", "Limit the access to %s to groups meeting this criteria:" => "Begränsa åtkomsten till %s till grupper som möter följande kriterie:", diff --git a/apps/user_ldap/l10n/ta_LK.php b/apps/user_ldap/l10n/ta_LK.php index 30e59cb8374..c7efcf05894 100644 --- a/apps/user_ldap/l10n/ta_LK.php +++ b/apps/user_ldap/l10n/ta_LK.php @@ -4,6 +4,7 @@ $TRANSLATIONS = array( "Error" => "வழு", "_%s group found_::_%s groups found_" => array("",""), "_%s user found_::_%s users found_" => array("",""), +"Save" => "சேமிக்க ", "Help" => "உதவி", "Host" => "ஓம்புனர்", "You can omit the protocol, except you require SSL. Then start with ldaps://" => "நீங்கள் SSL சேவையை தவிர உடன்படு வரைமுறையை தவிர்க்க முடியும். பிறகு ldaps:.// உடன் ஆரம்பிக்கவும்", diff --git a/apps/user_ldap/l10n/te.php b/apps/user_ldap/l10n/te.php index 734f200cf9c..ad3ffb1c5e8 100644 --- a/apps/user_ldap/l10n/te.php +++ b/apps/user_ldap/l10n/te.php @@ -3,6 +3,7 @@ $TRANSLATIONS = array( "Error" => "పొరపాటు", "_%s group found_::_%s groups found_" => array("",""), "_%s user found_::_%s users found_" => array("",""), +"Save" => "భద్రపరచు", "Help" => "సహాయం", "Password" => "సంకేతపదం" ); diff --git a/apps/user_ldap/l10n/th_TH.php b/apps/user_ldap/l10n/th_TH.php index 9835a6f7a3b..344015002db 100644 --- a/apps/user_ldap/l10n/th_TH.php +++ b/apps/user_ldap/l10n/th_TH.php @@ -15,6 +15,7 @@ $TRANSLATIONS = array( "Confirm Deletion" => "ยืนยันการลบทิ้ง", "_%s group found_::_%s groups found_" => array(""), "_%s user found_::_%s users found_" => array(""), +"Save" => "บันทึก", "Help" => "ช่วยเหลือ", "Add Server Configuration" => "เพิ่มการกำหนดค่าเซิร์ฟเวอร์", "Host" => "โฮสต์", diff --git a/apps/user_ldap/l10n/tr.php b/apps/user_ldap/l10n/tr.php index efa9ce1b32e..80fd5705772 100644 --- a/apps/user_ldap/l10n/tr.php +++ b/apps/user_ldap/l10n/tr.php @@ -3,14 +3,14 @@ $TRANSLATIONS = array( "Failed to clear the mappings." => "Dönüşümleri(mapping) temizleme hata oluştu.", "Failed to delete the server configuration" => "Sunucu yapılandırmasını silme başarısız oldu", "The configuration is valid and the connection could be established!" => "Yapılandırma geçerli ve bağlantı kuruldu!", -"The configuration is valid, but the Bind failed. Please check the server settings and credentials." => "Yapılandırma geçerli fakat bağlanma(bind) başarısız. Lütfen Sunucu ayarları ve kimlik bilgilerini kontrol ediniz.", +"The configuration is valid, but the Bind failed. Please check the server settings and credentials." => "Yapılandırma geçerli fakat bağlama (bind) başarısız. Lütfen Sunucu ayarları ve kimlik bilgilerini kontrol edin.", "The configuration is invalid. Please have a look at the logs for further details." => "Yapılandırma geçersiz. Lütfen detaylar için günlüklere bakınız.", "No action specified" => "Eylem belirtilmedi", "No configuration specified" => "Yapılandırma belirtilmemiş", "No data specified" => "Veri belirtilmemiş", " Could not set configuration %s" => "Yapılandırma %s olarak ayarlanamadı", "Deletion failed" => "Silme başarısız oldu", -"Take over settings from recent server configuration?" => "Ayarları son sunucu yapılandırmalarından devral?", +"Take over settings from recent server configuration?" => "Ayarlar son sunucu yapılandırmalarından devralınsın mı?", "Keep settings?" => "Ayarlar kalsın mı?", "Cannot add server configuration" => "Sunucu yapılandırması eklenemedi", "mappings cleared" => "Dönüşümler temizlendi", @@ -27,6 +27,7 @@ $TRANSLATIONS = array( "_%s user found_::_%s users found_" => array("%s kullanıcı bulundu","%s kullanıcı bulundu"), "Invalid Host" => "Geçersiz Makine", "Could not find the desired feature" => "İstenen özellik bulunamadı", +"Save" => "Kaydet", "Test Configuration" => "Test Yapılandırması", "Help" => "Yardım", "Limit the access to %s to groups meeting this criteria:" => "%s erişimini, şu kriterle eşleşen gruplara sınırla:", diff --git a/apps/user_ldap/l10n/ug.php b/apps/user_ldap/l10n/ug.php index 0ca11c6120b..2b991501cbb 100644 --- a/apps/user_ldap/l10n/ug.php +++ b/apps/user_ldap/l10n/ug.php @@ -4,6 +4,7 @@ $TRANSLATIONS = array( "Error" => "خاتالىق", "_%s group found_::_%s groups found_" => array(""), "_%s user found_::_%s users found_" => array(""), +"Save" => "ساقلا", "Help" => "ياردەم", "Host" => "باش ئاپپارات", "Port" => "ئېغىز", diff --git a/apps/user_ldap/l10n/uk.php b/apps/user_ldap/l10n/uk.php index 6d3d57f946c..ed0a9c3407f 100644 --- a/apps/user_ldap/l10n/uk.php +++ b/apps/user_ldap/l10n/uk.php @@ -16,6 +16,7 @@ $TRANSLATIONS = array( "Confirm Deletion" => "Підтвердіть Видалення", "_%s group found_::_%s groups found_" => array("","",""), "_%s user found_::_%s users found_" => array("","",""), +"Save" => "Зберегти", "Test Configuration" => "Тестове налаштування", "Help" => "Допомога", "Add Server Configuration" => "Додати налаштування Сервера", diff --git a/apps/user_ldap/l10n/uz.php b/apps/user_ldap/l10n/uz.php new file mode 100644 index 00000000000..bba52d53a1a --- /dev/null +++ b/apps/user_ldap/l10n/uz.php @@ -0,0 +1,6 @@ +<?php +$TRANSLATIONS = array( +"_%s group found_::_%s groups found_" => array(""), +"_%s user found_::_%s users found_" => array("") +); +$PLURAL_FORMS = "nplurals=1; plural=0;"; diff --git a/apps/user_ldap/l10n/vi.php b/apps/user_ldap/l10n/vi.php index 49347b12518..803101ef583 100644 --- a/apps/user_ldap/l10n/vi.php +++ b/apps/user_ldap/l10n/vi.php @@ -6,6 +6,7 @@ $TRANSLATIONS = array( "Select groups" => "Chọn nhóm", "_%s group found_::_%s groups found_" => array(""), "_%s user found_::_%s users found_" => array(""), +"Save" => "Lưu", "Help" => "Giúp đỡ", "Host" => "Máy chủ", "You can omit the protocol, except you require SSL. Then start with ldaps://" => "Bạn có thể bỏ qua các giao thức, ngoại trừ SSL. Sau đó bắt đầu với ldaps://", diff --git a/apps/user_ldap/l10n/zh_CN.php b/apps/user_ldap/l10n/zh_CN.php index cfe60f20fb5..edc02471def 100644 --- a/apps/user_ldap/l10n/zh_CN.php +++ b/apps/user_ldap/l10n/zh_CN.php @@ -18,6 +18,7 @@ $TRANSLATIONS = array( "Confirm Deletion" => "确认删除", "_%s group found_::_%s groups found_" => array(""), "_%s user found_::_%s users found_" => array(""), +"Save" => "保存", "Test Configuration" => "测试配置", "Help" => "帮助", "Add Server Configuration" => "添加服务器配置", diff --git a/apps/user_ldap/l10n/zh_HK.php b/apps/user_ldap/l10n/zh_HK.php index 222f7c7b3ca..cb504b17463 100644 --- a/apps/user_ldap/l10n/zh_HK.php +++ b/apps/user_ldap/l10n/zh_HK.php @@ -4,6 +4,7 @@ $TRANSLATIONS = array( "Error" => "錯誤", "_%s group found_::_%s groups found_" => array(""), "_%s user found_::_%s users found_" => array(""), +"Save" => "儲存", "Help" => "幫助", "Port" => "連接埠", "Password" => "密碼" diff --git a/apps/user_ldap/l10n/zh_TW.php b/apps/user_ldap/l10n/zh_TW.php index 0cf3827dd48..8687a0c87d8 100644 --- a/apps/user_ldap/l10n/zh_TW.php +++ b/apps/user_ldap/l10n/zh_TW.php @@ -18,6 +18,7 @@ $TRANSLATIONS = array( "Confirm Deletion" => "確認刪除", "_%s group found_::_%s groups found_" => array(""), "_%s user found_::_%s users found_" => array(""), +"Save" => "儲存", "Test Configuration" => "測試此設定", "Help" => "說明", "Add Server Configuration" => "新增伺服器設定", diff --git a/apps/user_ldap/lib/jobs.php b/apps/user_ldap/lib/jobs.php index 2f90da3bfb6..9b108da6331 100644 --- a/apps/user_ldap/lib/jobs.php +++ b/apps/user_ldap/lib/jobs.php @@ -139,12 +139,12 @@ class Jobs extends \OC\BackgroundJob\TimedJob { return self::$groupBE; } $configPrefixes = Helper::getServerConfigurationPrefixes(true); - $ldapWrapper = new OCA\user_ldap\lib\LDAP(); + $ldapWrapper = new LDAP(); if(count($configPrefixes) === 1) { //avoid the proxy when there is only one LDAP server configured - $connector = new OCA\user_ldap\lib\Connection($ldapWrapper, $configPrefixes[0]); - $ldapAccess = new OCA\user_ldap\lib\Access($connector, $ldapWrapper); - self::$groupBE = new OCA\user_ldap\GROUP_LDAP($ldapAccess); + $connector = new Connection($ldapWrapper, $configPrefixes[0]); + $ldapAccess = new Access($connector, $ldapWrapper); + self::$groupBE = new \OCA\user_ldap\GROUP_LDAP($ldapAccess); } else { self::$groupBE = new \OCA\user_ldap\Group_Proxy($configPrefixes, $ldapWrapper); } diff --git a/apps/user_ldap/lib/wizard.php b/apps/user_ldap/lib/wizard.php index a2628ed1c8f..fb6aca9e961 100644 --- a/apps/user_ldap/lib/wizard.php +++ b/apps/user_ldap/lib/wizard.php @@ -63,8 +63,6 @@ class Wizard extends LDAPUtility { public function countGroups() { if(!$this->checkRequirements(array('ldapHost', 'ldapPort', - 'ldapAgentName', - 'ldapAgentPassword', 'ldapBase', ))) { return false; @@ -98,8 +96,6 @@ class Wizard extends LDAPUtility { public function countUsers() { if(!$this->checkRequirements(array('ldapHost', 'ldapPort', - 'ldapAgentName', - 'ldapAgentPassword', 'ldapBase', 'ldapUserFilter', ))) { @@ -130,8 +126,6 @@ class Wizard extends LDAPUtility { public function determineAttributes() { if(!$this->checkRequirements(array('ldapHost', 'ldapPort', - 'ldapAgentName', - 'ldapAgentPassword', 'ldapBase', 'ldapUserFilter', ))) { @@ -160,8 +154,6 @@ class Wizard extends LDAPUtility { private function getUserAttributes() { if(!$this->checkRequirements(array('ldapHost', 'ldapPort', - 'ldapAgentName', - 'ldapAgentPassword', 'ldapBase', 'ldapUserFilter', ))) { @@ -214,8 +206,6 @@ class Wizard extends LDAPUtility { private function determineGroups($dbkey, $confkey, $testMemberOf = true) { if(!$this->checkRequirements(array('ldapHost', 'ldapPort', - 'ldapAgentName', - 'ldapAgentPassword', 'ldapBase', ))) { return false; @@ -242,8 +232,6 @@ class Wizard extends LDAPUtility { public function determineGroupMemberAssoc() { if(!$this->checkRequirements(array('ldapHost', 'ldapPort', - 'ldapAgentName', - 'ldapAgentPassword', 'ldapGroupFilter', ))) { return false; @@ -266,8 +254,6 @@ class Wizard extends LDAPUtility { public function determineGroupObjectClasses() { if(!$this->checkRequirements(array('ldapHost', 'ldapPort', - 'ldapAgentName', - 'ldapAgentPassword', 'ldapBase', ))) { return false; @@ -294,8 +280,6 @@ class Wizard extends LDAPUtility { public function determineUserObjectClasses() { if(!$this->checkRequirements(array('ldapHost', 'ldapPort', - 'ldapAgentName', - 'ldapAgentPassword', 'ldapBase', ))) { return false; @@ -322,8 +306,6 @@ class Wizard extends LDAPUtility { public function getGroupFilter() { if(!$this->checkRequirements(array('ldapHost', 'ldapPort', - 'ldapAgentName', - 'ldapAgentPassword', 'ldapBase', ))) { return false; @@ -344,8 +326,6 @@ class Wizard extends LDAPUtility { public function getUserListFilter() { if(!$this->checkRequirements(array('ldapHost', 'ldapPort', - 'ldapAgentName', - 'ldapAgentPassword', 'ldapBase', ))) { return false; @@ -368,13 +348,12 @@ class Wizard extends LDAPUtility { public function getUserLoginFilter() { if(!$this->checkRequirements(array('ldapHost', 'ldapPort', - 'ldapAgentName', - 'ldapAgentPassword', 'ldapBase', 'ldapUserFilter', ))) { return false; } + $filter = $this->composeLdapFilter(self::LFILTER_LOGIN); if(!$filter) { throw new \Exception('Cannot create filter'); @@ -390,8 +369,6 @@ class Wizard extends LDAPUtility { */ public function guessPortAndTLS() { if(!$this->checkRequirements(array('ldapHost', - 'ldapAgentName', - 'ldapAgentPassword' ))) { return false; } @@ -431,8 +408,6 @@ class Wizard extends LDAPUtility { */ public function guessBaseDN() { if(!$this->checkRequirements(array('ldapHost', - 'ldapAgentName', - 'ldapAgentPassword', 'ldapPort', ))) { return false; @@ -812,7 +787,22 @@ class Wizard extends LDAPUtility { throw new \Exception($error); } + /** + * @brief checks whether a valid combination of agent and password has been + * provided (either two values or nothing for anonymous connect) + * @return boolean, true if everything is fine, false otherwise + * + */ + private function checkAgentRequirements() { + $agent = $this->configuration->ldapAgentName; + $pwd = $this->configuration->ldapAgentPassword; + + return ( (!empty($agent) && !empty($pwd)) + || (empty($agent) && empty($pwd))); + } + private function checkRequirements($reqs) { + $this->checkAgentRequirements(); foreach($reqs as $option) { $value = $this->configuration->$option; if(empty($value)) { @@ -1018,9 +1008,9 @@ class Wizard extends LDAPUtility { //In case the port is already provided, we will check this first if($port > 0) { $hostInfo = parse_url($host); - if(is_array($hostInfo) + if(!(is_array($hostInfo) && isset($hostInfo['scheme']) - && stripos($hostInfo['scheme'], 'ldaps') === false) { + && stripos($hostInfo['scheme'], 'ldaps') !== false)) { $portSettings[] = array('port' => $port, 'tls' => true); } $portSettings[] =array('port' => $port, 'tls' => false); diff --git a/apps/user_ldap/templates/part.settingcontrols.php b/apps/user_ldap/templates/part.settingcontrols.php index 017f21c8b1c..0cdb8ccf16f 100644 --- a/apps/user_ldap/templates/part.settingcontrols.php +++ b/apps/user_ldap/templates/part.settingcontrols.php @@ -1,6 +1,6 @@ <div class="ldapSettingControls"> - <input id="ldap_submit" type="submit" value="Save" /> - <button id="ldap_action_test_connection" name="ldap_action_test_connection"> + <input class="ldap_submit" value="<?php p($l->t('Save'));?>" type="submit"> + <button class="ldap_action_test_connection" name="ldap_action_test_connection"> <?php p($l->t('Test Configuration'));?> </button> <a href="<?php p($theme->getDocBaseUrl()); ?>/server/5.0/admin_manual/auth_ldap.html" diff --git a/apps/user_ldap/templates/part.wizard-server.php b/apps/user_ldap/templates/part.wizard-server.php index 01dd8d0fcb2..fde7c36cdd1 100644 --- a/apps/user_ldap/templates/part.wizard-server.php +++ b/apps/user_ldap/templates/part.wizard-server.php @@ -32,7 +32,7 @@ /> <span> <input type="number" id="ldap_port" name="ldap_port" - class="invisible lwautosave" + class="lwautosave" placeholder="<?php p($l->t('Port'));?>" /> </span> </div> @@ -56,7 +56,7 @@ <div class="tablerow"> <textarea id="ldap_base" name="ldap_base" - class="tablecell invisible lwautosave" + class="tablecell lwautosave" placeholder="<?php p($l->t('One Base DN per line'));?>" title="<?php p($l->t('You can specify Base DN for users and groups in the Advanced tab'));?>"> </textarea> diff --git a/apps/user_ldap/templates/settings.php b/apps/user_ldap/templates/settings.php index 22aab0186f7..feb5ac6385d 100644 --- a/apps/user_ldap/templates/settings.php +++ b/apps/user_ldap/templates/settings.php @@ -20,8 +20,7 @@ <h3><?php p($l->t('Connection Settings'));?></h3> <div> <p><label for="ldap_configuration_active"><?php p($l->t('Configuration Active'));?></label><input type="checkbox" id="ldap_configuration_active" name="ldap_configuration_active" value="1" data-default="<?php p($_['ldap_configuration_active_default']); ?>" title="<?php p($l->t('When unchecked, this configuration will be skipped.'));?>" /></p> - <p><label for="ldap_login_filter"><?php p($l->t('User Login Filter'));?></label> - <input type="text" id="ldap_login_filter" name="ldap_login_filter" + <p><label for="ldap_login_filter"><?php p($l->t('User Login Filter'));?></label><input type="text" id="ldap_login_filter" name="ldap_login_filter" data-default="<?php p($_['ldap_login_filter_default']); ?>" title="<?php p($l->t('Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: "uid=%%uid"'));?>" /></p> <p><label for="ldap_backup_host"><?php p($l->t('Backup (Replica) Host'));?></label><input type="text" id="ldap_backup_host" name="ldap_backup_host" data-default="<?php p($_['ldap_backup_host_default']); ?>" title="<?php p($l->t('Give an optional backup host. It must be a replica of the main LDAP/AD server.'));?>"></p> diff --git a/apps/user_webdavauth/l10n/eo.php b/apps/user_webdavauth/l10n/eo.php index ddcac32ca1b..3a82bfdf41e 100644 --- a/apps/user_webdavauth/l10n/eo.php +++ b/apps/user_webdavauth/l10n/eo.php @@ -1,5 +1,6 @@ <?php $TRANSLATIONS = array( -"WebDAV Authentication" => "WebDAV-aŭtentigo" +"WebDAV Authentication" => "WebDAV-aŭtentigo", +"Address: " => "Adreso:" ); $PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/user_webdavauth/l10n/ms_MY.php b/apps/user_webdavauth/l10n/ms_MY.php new file mode 100644 index 00000000000..a9266aa56ca --- /dev/null +++ b/apps/user_webdavauth/l10n/ms_MY.php @@ -0,0 +1,7 @@ +<?php +$TRANSLATIONS = array( +"WebDAV Authentication" => "Pengesahan ", +"Address: " => "Alamat:", +"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Butiran pengguna akan dihantar ke alamat ini. Plugin ini memeriksa maklum balas dan akan mentafsir kod status HTTP 401 dan 403 sebagai butiran tidak sah, dan semua maklum balas lain sebagai butiran yang sah." +); +$PLURAL_FORMS = "nplurals=1; plural=0;"; |