Compare commits
191 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| a4e842f19a | |||
| aec0f06501 | |||
| f9e4d0a5e2 | |||
| 3093c63024 | |||
| b0edbd8ebd | |||
| 5dd20db05f | |||
| 0c140d5f6e | |||
| 49969825ad | |||
| 3b21499b34 | |||
| 3fde29ead4 | |||
| afe35ca12d | |||
| a83e37c799 | |||
| 3c7541e97c | |||
| 3ec3ebb3db | |||
| 3e71827bea | |||
| 6adac6a673 | |||
| 88dc71381f | |||
| c6ca9be406 | |||
| 7dddf59942 | |||
| 8ef32821be | |||
| 1e9f0409c3 | |||
| bcec9cea78 | |||
| 87cfbb3a2b | |||
| 3b1396b538 | |||
| ce1a1996f7 | |||
| 5f2e8f7723 | |||
| 54cd174f61 | |||
| 28be8496a9 | |||
| 3ae7bfc298 | |||
| 1cbe1896e7 | |||
| ebe3872c64 | |||
| f1ea0bcafc | |||
| cf8fc2294e | |||
| 1636c6dbd8 | |||
| 59ff8388ea | |||
| 1c58d8b226 | |||
| 0f58bd02c1 | |||
| 4b4901519d | |||
| a711d4e39a | |||
| 52dc90d5fd | |||
| 9a1cbabdd6 | |||
| 596ab7552e | |||
| ea23a09c05 | |||
| 394bd17251 | |||
| 627612c9e0 | |||
| c6fa2dd8e2 | |||
| 8d38228c98 | |||
| bbba8fd09d | |||
| 5e928fc988 | |||
| 7e36763631 | |||
| 542cf79595 | |||
| 2ea3765359 | |||
| b7aaebf94f | |||
| c9cb258616 | |||
| 697ad1ca9e | |||
| 6a838718df | |||
| 6a21922854 | |||
| c81a05cbb1 | |||
| 956a4419d8 | |||
| f356ef90d7 | |||
| a8fd55d90d | |||
| 208037b56a | |||
| 62887c67ab | |||
| 9960596f4e | |||
| b5ef21b22d | |||
| 44fb817a4e | |||
| 2c54dcda89 | |||
| 0bb7202ff7 | |||
| 75eaea1dff | |||
| 93b6c83814 | |||
| d9df271113 | |||
| 13461698e4 | |||
| eaa5dd0282 | |||
| 672cbc5378 | |||
| 2f568c9766 | |||
| c4c972fd2f | |||
| 6de259e0ac | |||
| 1f93b4e842 | |||
| 4c2d2f4dc9 | |||
| 148c16bf70 | |||
| 77af1a7127 | |||
| 2f0ec8256f | |||
| 913df0c5ed | |||
| c88109a496 | |||
| 8f5dfd0920 | |||
| ae58a385b7 | |||
| 3160b23291 | |||
| 73a0b690e9 | |||
| bdb4890d04 | |||
| 9091dd7833 | |||
| a8a35f4d07 | |||
| 0d24b22485 | |||
| e8a696cff9 | |||
| 811ef19ada | |||
| db696a2dda | |||
| 3d81009347 | |||
| 0b665700b5 | |||
| 1e407482be | |||
| d343c66f85 | |||
| 0a0d89296b | |||
| fede36d515 | |||
| 527a16852e | |||
| aab7c187f2 | |||
| dd7b074dfa | |||
| 71e93c2b79 | |||
| ca161e2a96 | |||
| ab8691d84b | |||
| a48cf28e17 | |||
| cd7c974fb6 | |||
| 3b5d032dd5 | |||
| f8088ecd29 | |||
| e83ff69465 | |||
| 66af605697 | |||
| 71dc81d420 | |||
| 02c9bb76ff | |||
| 7b388eb4a8 | |||
| c770089b50 | |||
| afaac05f61 | |||
| aba8199a82 | |||
| 0134b1ebfa | |||
| 339e073399 | |||
| 4feafda822 | |||
| 5ac339b866 | |||
| 95c90ddbc4 | |||
| 2417c8a49e | |||
| 26d0adf2fe | |||
| 734fdbddea | |||
| 33144941a9 | |||
| f309920bef | |||
| e78a309111 | |||
| 46a4ad4f3c | |||
| 3842c0d766 | |||
| 8369c1f05b | |||
| cadf1c232e | |||
| 713651738c | |||
| 1475245465 | |||
| 281bbf4bd4 | |||
| a2bbbb1448 | |||
| 87a28957aa | |||
| 01de6c565a | |||
| f3e341edac | |||
| c5d6af3c5a | |||
| cc1577054d | |||
| 3e6b18b2d0 | |||
| 7eb505e6dd | |||
| 91ca1cf985 | |||
| f8a4bcdd50 | |||
| 418d401bf9 | |||
| d0afd774b7 | |||
| 0af65cae37 | |||
| 4d50fe5f12 | |||
| f24aca61a9 | |||
| d3e2226b38 | |||
| 73fa6259be | |||
| dffc2a8b1c | |||
| fd634fdec8 | |||
| 328ebaefde | |||
| 4de8c4e5db | |||
| 8dc3cb2ffb | |||
| c67ece0f6b | |||
| 6640e120b7 | |||
| 6f7b394d99 | |||
| 91f47645b0 | |||
| 18903cc8f7 | |||
| 7e467484a8 | |||
| 21bf6abd41 | |||
| 401728b2a2 | |||
| bfd0dc3314 | |||
| ad92b12559 | |||
| 4391992b8c | |||
| 728e6d735a | |||
| 66df8c3bb3 | |||
| ca08d21da0 | |||
| 7d0f458f11 | |||
| f15aeb3bbc | |||
| 9333244925 | |||
| 50f5ab8515 | |||
| 4df0d2e7e8 | |||
| f2e17a0b68 | |||
| e372971f2b | |||
| 3bf30377b8 | |||
| 67b67b6d66 | |||
| b8390f15d4 | |||
| 5ac3f9bfa5 | |||
| 02fe013d2f | |||
| 5e5e4fe3a4 | |||
| d49e4e53fd | |||
| 2d11290121 | |||
| 1a197292da | |||
| 3b59979746 | |||
| 259d619af3 |
@@ -38,3 +38,6 @@ DirectoryIndex index.php index.html
|
||||
</IfModule>
|
||||
AddDefaultCharset utf-8
|
||||
Options -Indexes
|
||||
<IfModule pagespeed_module>
|
||||
ModPagespeed Off
|
||||
</IfModule>
|
||||
|
||||
+1
-1
Submodule 3rdparty updated: 42efd96628...1b2e3c8f6a
@@ -37,12 +37,7 @@ if(!\OC\Files\Filesystem::file_exists($filename)) {
|
||||
$ftype=\OC\Files\Filesystem::getMimeType( $filename );
|
||||
|
||||
header('Content-Type:'.$ftype);
|
||||
if ( preg_match( "/MSIE/", $_SERVER["HTTP_USER_AGENT"] ) ) {
|
||||
header( 'Content-Disposition: attachment; filename="' . rawurlencode( basename($filename) ) . '"' );
|
||||
} else {
|
||||
header( 'Content-Disposition: attachment; filename*=UTF-8\'\'' . rawurlencode( basename($filename) )
|
||||
. '; filename="' . rawurlencode( basename($filename) ) . '"' );
|
||||
}
|
||||
OCP\Response::setContentDispositionHeader(basename($filename), 'attachment');
|
||||
OCP\Response::disableCaching();
|
||||
header('Content-Length: '.\OC\Files\Filesystem::filesize($filename));
|
||||
|
||||
|
||||
@@ -222,6 +222,14 @@ $(document).ready(function() {
|
||||
|
||||
//examine file
|
||||
var file = data.files[0];
|
||||
try {
|
||||
// FIXME: not so elegant... need to refactor that method to return a value
|
||||
Files.isFileNameValid(file.name);
|
||||
}
|
||||
catch (errorMessage) {
|
||||
data.textStatus = 'invalidcharacters';
|
||||
data.errorThrown = errorMessage;
|
||||
}
|
||||
|
||||
if (file.type === '' && file.size === 4096) {
|
||||
data.textStatus = 'dirorzero';
|
||||
@@ -605,7 +613,7 @@ $(document).ready(function() {
|
||||
if (result.status === 'success') {
|
||||
var date=new Date();
|
||||
FileList.addDir(name, 0, date, hidden);
|
||||
var tr=$('tr[data-file="'+name+'"]');
|
||||
var tr = FileList.findFileEl(name);
|
||||
tr.attr('data-id', result.data.id);
|
||||
} else {
|
||||
OC.dialogs.alert(result.data.message, t('core', 'Could not create folder'));
|
||||
@@ -647,7 +655,7 @@ $(document).ready(function() {
|
||||
$('#uploadprogressbar').fadeOut();
|
||||
var date = new Date();
|
||||
FileList.addFile(localName, size, date, false, hidden);
|
||||
var tr = $('tr[data-file="'+localName+'"]');
|
||||
var tr = FileList.findFileEl(localName);
|
||||
tr.data('mime', mime).data('id', id);
|
||||
tr.attr('data-id', id);
|
||||
var path = $('#dir').val()+'/'+localName;
|
||||
|
||||
@@ -71,7 +71,7 @@ var FileActions = {
|
||||
FileActions.currentFile = parent;
|
||||
var actions = FileActions.get(FileActions.getCurrentMimeType(), FileActions.getCurrentType(), FileActions.getCurrentPermissions());
|
||||
var file = FileActions.getCurrentFile();
|
||||
if ($('tr[data-file="'+file+'"]').data('renaming')) {
|
||||
if (FileList.findFileEl(file).data('renaming')) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
+30
-19
@@ -6,6 +6,13 @@ var FileList={
|
||||
$(this).attr('data-file',decodeURIComponent($(this).attr('data-file')));
|
||||
});
|
||||
},
|
||||
/**
|
||||
* Returns the tr element for a given file name
|
||||
*/
|
||||
findFileEl: function(fileName){
|
||||
// use filterAttr to avoid escaping issues
|
||||
return $('#fileList tr').filterAttr('data-file', fileName);
|
||||
},
|
||||
update:function(fileListHtml) {
|
||||
var $fileList = $('#fileList');
|
||||
$fileList.empty().html(fileListHtml);
|
||||
@@ -292,8 +299,9 @@ var FileList={
|
||||
$('#filestable').toggleClass('hidden', show);
|
||||
},
|
||||
remove:function(name){
|
||||
$('tr').filterAttr('data-file',name).find('td.filename').draggable('destroy');
|
||||
$('tr').filterAttr('data-file',name).remove();
|
||||
var fileEl = FileList.findFileEl(name);
|
||||
fileEl.find('td.filename').draggable('destroy');
|
||||
fileEl.remove();
|
||||
FileList.updateFileSummary();
|
||||
if ( ! $('tr[data-file]').exists() ) {
|
||||
$('#emptycontent').removeClass('hidden');
|
||||
@@ -334,7 +342,7 @@ var FileList={
|
||||
FileList.updateFileSummary();
|
||||
},
|
||||
loadingDone:function(name, id) {
|
||||
var mime, tr = $('tr[data-file="'+name+'"]');
|
||||
var mime, tr = FileList.findFileEl(name);
|
||||
tr.data('loading', false);
|
||||
mime = tr.data('mime');
|
||||
tr.attr('data-mime', mime);
|
||||
@@ -347,12 +355,12 @@ var FileList={
|
||||
}, null, null, tr.attr('data-etag'));
|
||||
tr.find('td.filename').draggable(dragOptions);
|
||||
},
|
||||
isLoading:function(name) {
|
||||
return $('tr[data-file="'+name+'"]').data('loading');
|
||||
isLoading:function(file) {
|
||||
return FileList.findFileEl(file).data('loading');
|
||||
},
|
||||
rename:function(oldname) {
|
||||
var tr, td, input, form;
|
||||
tr = $('tr[data-file="'+oldname+'"]');
|
||||
tr = FileList.findFileEl(oldname);
|
||||
tr.data('renaming',true);
|
||||
td = tr.children('td.filename');
|
||||
input = $('<input type="text" class="filename"/>').val(oldname);
|
||||
@@ -500,14 +508,16 @@ var FileList={
|
||||
form.trigger('submit');
|
||||
});
|
||||
},
|
||||
inList:function(filename) {
|
||||
return $('#fileList tr[data-file="'+filename+'"]').length;
|
||||
inList:function(file) {
|
||||
return FileList.findFileEl(file).length;
|
||||
},
|
||||
replace:function(oldName, newName, isNewFile) {
|
||||
// Finish any existing actions
|
||||
$('tr[data-file="'+oldName+'"]').hide();
|
||||
$('tr[data-file="'+newName+'"]').hide();
|
||||
var tr = $('tr[data-file="'+oldName+'"]').clone();
|
||||
var oldFileEl = FileList.findFileEl(oldName);
|
||||
var newFileEl = FileList.findFileEl(newName);
|
||||
oldFileEl.hide();
|
||||
newFileEl.hide();
|
||||
var tr = oldFileEl.clone();
|
||||
tr.attr('data-replace', 'true');
|
||||
tr.attr('data-file', newName);
|
||||
var td = tr.children('td.filename');
|
||||
@@ -559,7 +569,7 @@ var FileList={
|
||||
files=[files];
|
||||
}
|
||||
for (var i=0; i<files.length; i++) {
|
||||
var deleteAction = $('tr[data-file="'+files[i]+'"]').children("td.date").children(".action.delete");
|
||||
var deleteAction = FileList.findFileEl(files[i]).children("td.date").children(".action.delete");
|
||||
deleteAction.removeClass('delete-icon').addClass('progress-icon');
|
||||
}
|
||||
// Finish any existing actions
|
||||
@@ -573,7 +583,7 @@ var FileList={
|
||||
function(result) {
|
||||
if (result.status === 'success') {
|
||||
$.each(files,function(index,file) {
|
||||
var files = $('tr[data-file="'+file+'"]');
|
||||
var files = FileList.findFileEl(file);
|
||||
files.remove();
|
||||
files.find('input[type="checkbox"]').removeAttr('checked');
|
||||
files.removeClass('selected');
|
||||
@@ -595,7 +605,7 @@ var FileList={
|
||||
OC.Notification.hide();
|
||||
}, 10000);
|
||||
$.each(files,function(index,file) {
|
||||
var deleteAction = $('tr[data-file="' + file + '"] .action.delete');
|
||||
var deleteAction = FileList.findFileEl(file).find('.action.delete');
|
||||
deleteAction.removeClass('progress-icon').addClass('delete-icon');
|
||||
});
|
||||
}
|
||||
@@ -737,7 +747,7 @@ var FileList={
|
||||
},
|
||||
scrollTo:function(file) {
|
||||
//scroll to and highlight preselected file
|
||||
var $scrolltorow = $('tr[data-file="'+file+'"]');
|
||||
var $scrolltorow = FileList.findFileEl(file);
|
||||
if ($scrolltorow.exists()) {
|
||||
$scrolltorow.addClass('searchresult');
|
||||
$(window).scrollTop($scrolltorow.position().top);
|
||||
@@ -949,7 +959,7 @@ $(document).ready(function() {
|
||||
$('#notification').on('click', '.undo', function() {
|
||||
if (FileList.deleteFiles) {
|
||||
$.each(FileList.deleteFiles,function(index,file) {
|
||||
$('tr[data-file="'+file+'"]').show();
|
||||
FileList.findFileEl(file).show();
|
||||
});
|
||||
FileList.deleteCanceled=true;
|
||||
FileList.deleteFiles=null;
|
||||
@@ -959,10 +969,10 @@ $(document).ready(function() {
|
||||
FileList.deleteCanceled = false;
|
||||
FileList.deleteFiles = [FileList.replaceOldName];
|
||||
} else {
|
||||
$('tr[data-file="'+FileList.replaceOldName+'"]').show();
|
||||
FileList.findFileEl(FileList.replaceOldName).show();
|
||||
}
|
||||
$('tr[data-replace="true"').remove();
|
||||
$('tr[data-file="'+FileList.replaceNewName+'"]').show();
|
||||
FileList.findFileEl(FileList.replaceNewName).show();
|
||||
FileList.replaceCanceled = true;
|
||||
FileList.replaceOldName = null;
|
||||
FileList.replaceNewName = null;
|
||||
@@ -977,7 +987,8 @@ $(document).ready(function() {
|
||||
});
|
||||
});
|
||||
$('#notification:first-child').on('click', '.suggest', function() {
|
||||
$('tr[data-file="'+$('#notification > span').attr('data-oldName')+'"]').show();
|
||||
var file = $('#notification > span').attr('data-oldName');
|
||||
FileList.findFileEl(file).show();
|
||||
OC.Notification.hide();
|
||||
});
|
||||
$('#notification:first-child').on('click', '.cancel', function() {
|
||||
|
||||
@@ -282,7 +282,7 @@ $(document).ready(function() {
|
||||
procesSelection();
|
||||
} else {
|
||||
var filename=$(this).parent().parent().attr('data-file');
|
||||
var tr=$('tr[data-file="'+filename+'"]');
|
||||
var tr = FileList.findFileEl(filename);
|
||||
var renaming=tr.data('renaming');
|
||||
if (!renaming && !FileList.isLoading(filename)) {
|
||||
FileActions.currentFile = $(this).parent();
|
||||
@@ -541,10 +541,12 @@ var folderDropOptions={
|
||||
if (result) {
|
||||
if (result.status === 'success') {
|
||||
//recalculate folder size
|
||||
var oldSize = $('#fileList tr[data-file="'+target+'"]').data('size');
|
||||
var newSize = oldSize + $('#fileList tr[data-file="'+file+'"]').data('size');
|
||||
$('#fileList tr[data-file="'+target+'"]').data('size', newSize);
|
||||
$('#fileList tr[data-file="'+target+'"]').find('td.filesize').text(humanFileSize(newSize));
|
||||
var oldFile = FileList.findFileEl(target);
|
||||
var newFile = FileList.findFileEl(file);
|
||||
var oldSize = oldFile.data('size');
|
||||
var newSize = oldSize + newFile.data('size');
|
||||
oldFile.data('size', newSize);
|
||||
oldFile.find('td.filesize').text(humanFileSize(newSize));
|
||||
|
||||
FileList.remove(file);
|
||||
procesSelection();
|
||||
@@ -738,7 +740,7 @@ Files.lazyLoadPreview = function(path, mime, ready, width, height, etag) {
|
||||
}
|
||||
|
||||
function getUniqueName(name) {
|
||||
if ($('tr[data-file="'+name+'"]').exists()) {
|
||||
if (FileList.findFileEl(name).exists()) {
|
||||
var parts=name.split('.');
|
||||
var extension = "";
|
||||
if (parts.length > 1) {
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
<?php
|
||||
$TRANSLATIONS = array(
|
||||
"Files" => "Файлы",
|
||||
"Share" => "Сделать общим",
|
||||
"Rename" => "Переименовать",
|
||||
"_%n folder_::_%n folders_" => array("","",""),
|
||||
"_%n file_::_%n files_" => array("","",""),
|
||||
"_Uploading %n file_::_Uploading %n files_" => array("","",""),
|
||||
"Error" => "Ошибка",
|
||||
"Size" => "Размер",
|
||||
"Upload" => "Загрузка",
|
||||
"Save" => "Сохранить",
|
||||
"Cancel upload" => "Отмена загрузки",
|
||||
"Download" => "Загрузка",
|
||||
"Delete" => "Удалить"
|
||||
);
|
||||
$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);";
|
||||
@@ -69,20 +69,11 @@
|
||||
<th <?php if (!$_['fileHeader']):?>class="hidden"<?php endif; ?> id="headerDate">
|
||||
<span id="modified"><?php p($l->t( 'Modified' )); ?></span>
|
||||
<?php if ($_['permissions'] & OCP\PERMISSION_DELETE): ?>
|
||||
<!-- NOTE: Temporary fix to allow unsharing of files in root of Shared folder -->
|
||||
<?php if ($_['dir'] == '/Shared'): ?>
|
||||
<span class="selectedActions"><a href="" class="delete-selected">
|
||||
<?php p($l->t('Unshare'))?>
|
||||
<img class="svg" alt="<?php p($l->t('Unshare'))?>"
|
||||
src="<?php print_unescaped(OCP\image_path("core", "actions/delete.svg")); ?>" />
|
||||
</a></span>
|
||||
<?php else: ?>
|
||||
<span class="selectedActions"><a href="" class="delete-selected">
|
||||
<?php p($l->t('Delete'))?>
|
||||
<img class="svg" alt="<?php p($l->t('Delete'))?>"
|
||||
src="<?php print_unescaped(OCP\image_path("core", "actions/delete.svg")); ?>" />
|
||||
</a></span>
|
||||
<?php endif; ?>
|
||||
<span class="selectedActions"><a href="" class="delete-selected">
|
||||
<?php p($l->t('Delete'))?>
|
||||
<img class="svg" alt="<?php p($l->t('Delete'))?>"
|
||||
src="<?php print_unescaped(OCP\image_path("core", "actions/delete.svg")); ?>" />
|
||||
</a></span>
|
||||
<?php endif; ?>
|
||||
</th>
|
||||
</tr>
|
||||
|
||||
@@ -1,10 +1,8 @@
|
||||
<?php if(count($_["breadcrumb"])):?>
|
||||
<div class="crumb" data-dir=''>
|
||||
<a href="<?php print_unescaped($_['baseURL']); ?>">
|
||||
<img src="<?php print_unescaped(OCP\image_path('core', 'places/home.svg'));?>" class="svg" />
|
||||
</a>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
<div class="crumb <?php if(!count($_["breadcrumb"])) p('last');?>" data-dir=''>
|
||||
<a href="<?php print_unescaped($_['baseURL']); ?>">
|
||||
<img src="<?php print_unescaped(OCP\image_path('core', 'places/home.svg'));?>" class="svg" />
|
||||
</a>
|
||||
</div>
|
||||
<?php for($i=0; $i<count($_["breadcrumb"]); $i++):
|
||||
$crumb = $_["breadcrumb"][$i];
|
||||
$dir = \OCP\Util::encodePath($crumb["dir"]); ?>
|
||||
|
||||
@@ -18,22 +18,19 @@
|
||||
<type>text</type>
|
||||
<notnull>true</notnull>
|
||||
<length>64</length>
|
||||
<comments>What client-side / server-side configuration is used</comments>
|
||||
</field>
|
||||
<field>
|
||||
<name>recovery_enabled</name>
|
||||
<type>integer</type>
|
||||
<notnull>true</notnull>
|
||||
<default>0</default>
|
||||
<comments>Whether encryption key recovery is enabled</comments>
|
||||
</field>
|
||||
<field>
|
||||
<name>migration_status</name>
|
||||
<type>integer</type>
|
||||
<notnull>true</notnull>
|
||||
<default>0</default>
|
||||
<comments>Whether encryption migration has been performed</comments>
|
||||
</field>
|
||||
</declaration>
|
||||
</table>
|
||||
</database>
|
||||
</database>
|
||||
|
||||
@@ -30,6 +30,9 @@ use OC\Files\Filesystem;
|
||||
*/
|
||||
class Hooks {
|
||||
|
||||
// file for which we want to rename the keys after the rename operation was successful
|
||||
private static $renamedFiles = array();
|
||||
|
||||
/**
|
||||
* @brief Startup encryption backend upon user login
|
||||
* @note This method should never be called for users using client side encryption
|
||||
@@ -179,9 +182,9 @@ class Hooks {
|
||||
// the necessary keys)
|
||||
if (Crypt::mode() === 'server') {
|
||||
|
||||
if ($params['uid'] === \OCP\User::getUser()) {
|
||||
$view = new \OC_FilesystemView('/');
|
||||
|
||||
$view = new \OC_FilesystemView('/');
|
||||
if ($params['uid'] === \OCP\User::getUser()) {
|
||||
|
||||
$session = new \OCA\Encryption\Session($view);
|
||||
|
||||
@@ -202,36 +205,41 @@ class Hooks {
|
||||
} else { // admin changed the password for a different user, create new keys and reencrypt file keys
|
||||
|
||||
$user = $params['uid'];
|
||||
$recoveryPassword = $params['recoveryPassword'];
|
||||
$newUserPassword = $params['password'];
|
||||
$util = new Util($view, $user);
|
||||
$recoveryPassword = isset($params['recoveryPassword']) ? $params['recoveryPassword'] : null;
|
||||
|
||||
$view = new \OC_FilesystemView('/');
|
||||
if (($util->recoveryEnabledForUser() && $recoveryPassword)
|
||||
|| !$util->userKeysExists()) {
|
||||
|
||||
// make sure that the users home is mounted
|
||||
\OC\Files\Filesystem::initMountPoints($user);
|
||||
$recoveryPassword = $params['recoveryPassword'];
|
||||
$newUserPassword = $params['password'];
|
||||
|
||||
$keypair = Crypt::createKeypair();
|
||||
// make sure that the users home is mounted
|
||||
\OC\Files\Filesystem::initMountPoints($user);
|
||||
|
||||
// Disable encryption proxy to prevent recursive calls
|
||||
$proxyStatus = \OC_FileProxy::$enabled;
|
||||
\OC_FileProxy::$enabled = false;
|
||||
$keypair = Crypt::createKeypair();
|
||||
|
||||
// Save public key
|
||||
$view->file_put_contents('/public-keys/' . $user . '.public.key', $keypair['publicKey']);
|
||||
// Disable encryption proxy to prevent recursive calls
|
||||
$proxyStatus = \OC_FileProxy::$enabled;
|
||||
\OC_FileProxy::$enabled = false;
|
||||
|
||||
// Encrypt private key empty passphrase
|
||||
$encryptedPrivateKey = Crypt::symmetricEncryptFileContent($keypair['privateKey'], $newUserPassword);
|
||||
// Save public key
|
||||
$view->file_put_contents('/public-keys/' . $user . '.public.key', $keypair['publicKey']);
|
||||
|
||||
// Save private key
|
||||
$view->file_put_contents(
|
||||
'/' . $user . '/files_encryption/' . $user . '.private.key', $encryptedPrivateKey);
|
||||
// Encrypt private key empty passphrase
|
||||
$encryptedPrivateKey = Crypt::symmetricEncryptFileContent($keypair['privateKey'], $newUserPassword);
|
||||
|
||||
if ($recoveryPassword) { // if recovery key is set we can re-encrypt the key files
|
||||
$util = new Util($view, $user);
|
||||
$util->recoverUsersFiles($recoveryPassword);
|
||||
// Save private key
|
||||
$view->file_put_contents(
|
||||
'/' . $user . '/files_encryption/' . $user . '.private.key', $encryptedPrivateKey);
|
||||
|
||||
if ($recoveryPassword) { // if recovery key is set we can re-encrypt the key files
|
||||
$util = new Util($view, $user);
|
||||
$util->recoverUsersFiles($recoveryPassword);
|
||||
}
|
||||
|
||||
\OC_FileProxy::$enabled = $proxyStatus;
|
||||
}
|
||||
|
||||
\OC_FileProxy::$enabled = $proxyStatus;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -474,6 +482,18 @@ class Hooks {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief mark file as renamed so that we know the original source after the file was renamed
|
||||
* @param array $params with the old path and the new path
|
||||
*/
|
||||
public static function preRename($params) {
|
||||
$util = new Util(new \OC_FilesystemView('/'), \OCP\User::getUser());
|
||||
list($ownerOld, $pathOld) = $util->getUidAndFilename($params['oldpath']);
|
||||
self::$renamedFiles[$params['oldpath']] = array(
|
||||
'uid' => $ownerOld,
|
||||
'path' => $pathOld);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief after a file is renamed, rename its keyfile and share-keys also fix the file size and fix also the sharing
|
||||
* @param array with oldpath and newpath
|
||||
@@ -496,19 +516,32 @@ class Hooks {
|
||||
$userId = \OCP\User::getUser();
|
||||
$util = new Util($view, $userId);
|
||||
|
||||
// Format paths to be relative to user files dir
|
||||
if ($util->isSystemWideMountPoint($params['oldpath'])) {
|
||||
$baseDir = 'files_encryption/';
|
||||
$oldKeyfilePath = $baseDir . 'keyfiles/' . $params['oldpath'];
|
||||
if (isset(self::$renamedFiles[$params['oldpath']]['uid']) &&
|
||||
isset(self::$renamedFiles[$params['oldpath']]['path'])) {
|
||||
$ownerOld = self::$renamedFiles[$params['oldpath']]['uid'];
|
||||
$pathOld = self::$renamedFiles[$params['oldpath']]['path'];
|
||||
} else {
|
||||
$baseDir = $userId . '/' . 'files_encryption/';
|
||||
$oldKeyfilePath = $baseDir . 'keyfiles/' . $params['oldpath'];
|
||||
\OCP\Util::writeLog('Encryption library', "can't get path and owner from the file before it was renamed", \OCP\Util::ERROR);
|
||||
return false;
|
||||
}
|
||||
|
||||
if ($util->isSystemWideMountPoint($params['newpath'])) {
|
||||
$newKeyfilePath = $baseDir . 'keyfiles/' . $params['newpath'];
|
||||
list($ownerNew, $pathNew) = $util->getUidAndFilename($params['newpath']);
|
||||
|
||||
// Format paths to be relative to user files dir
|
||||
if ($util->isSystemWideMountPoint($pathOld)) {
|
||||
$oldKeyfilePath = 'files_encryption/keyfiles/' . $pathOld;
|
||||
$oldShareKeyPath = 'files_encryption/share-keys/' . $pathOld;
|
||||
} else {
|
||||
$newKeyfilePath = $baseDir . 'keyfiles/' . $params['newpath'];
|
||||
$oldKeyfilePath = $ownerOld . '/' . 'files_encryption/keyfiles/' . $pathOld;
|
||||
$oldShareKeyPath = $ownerOld . '/' . 'files_encryption/share-keys/' . $pathOld;
|
||||
}
|
||||
|
||||
if ($util->isSystemWideMountPoint($pathNew)) {
|
||||
$newKeyfilePath = 'files_encryption/keyfiles/' . $pathNew;
|
||||
$newShareKeyPath = 'files_encryption/share-keys/' . $pathNew;
|
||||
} else {
|
||||
$newKeyfilePath = $ownerNew . '/files_encryption/keyfiles/' . $pathNew;
|
||||
$newShareKeyPath = $ownerNew . '/files_encryption/share-keys/' . $pathNew;
|
||||
}
|
||||
|
||||
// add key ext if this is not an folder
|
||||
@@ -517,11 +550,11 @@ class Hooks {
|
||||
$newKeyfilePath .= '.key';
|
||||
|
||||
// handle share-keys
|
||||
$localKeyPath = $view->getLocalFile($baseDir . 'share-keys/' . $params['oldpath']);
|
||||
$localKeyPath = $view->getLocalFile($oldShareKeyPath);
|
||||
$escapedPath = Helper::escapeGlobPattern($localKeyPath);
|
||||
$matches = glob($escapedPath . '*.shareKey');
|
||||
foreach ($matches as $src) {
|
||||
$dst = \OC\Files\Filesystem::normalizePath(str_replace($params['oldpath'], $params['newpath'], $src));
|
||||
$dst = \OC\Files\Filesystem::normalizePath(str_replace($pathOld, $pathNew, $src));
|
||||
|
||||
// create destination folder if not exists
|
||||
if (!file_exists(dirname($dst))) {
|
||||
@@ -533,15 +566,13 @@ class Hooks {
|
||||
|
||||
} else {
|
||||
// handle share-keys folders
|
||||
$oldShareKeyfilePath = $baseDir . 'share-keys/' . $params['oldpath'];
|
||||
$newShareKeyfilePath = $baseDir . 'share-keys/' . $params['newpath'];
|
||||
|
||||
// create destination folder if not exists
|
||||
if (!$view->file_exists(dirname($newShareKeyfilePath))) {
|
||||
$view->mkdir(dirname($newShareKeyfilePath), 0750, true);
|
||||
if (!$view->file_exists(dirname($newShareKeyPath))) {
|
||||
$view->mkdir(dirname($newShareKeyPath), 0750, true);
|
||||
}
|
||||
|
||||
$view->rename($oldShareKeyfilePath, $newShareKeyfilePath);
|
||||
$view->rename($oldShareKeyPath, $newShareKeyPath);
|
||||
}
|
||||
|
||||
// Rename keyfile so it isn't orphaned
|
||||
@@ -556,18 +587,17 @@ class Hooks {
|
||||
}
|
||||
|
||||
// build the path to the file
|
||||
$newPath = '/' . $userId . '/files' . $params['newpath'];
|
||||
$newPathRelative = $params['newpath'];
|
||||
$newPath = '/' . $ownerNew . '/files' . $pathNew;
|
||||
|
||||
if ($util->fixFileSize($newPath)) {
|
||||
// get sharing app state
|
||||
$sharingEnabled = \OCP\Share::isEnabled();
|
||||
|
||||
// get users
|
||||
$usersSharing = $util->getSharingUsersArray($sharingEnabled, $newPathRelative);
|
||||
$usersSharing = $util->getSharingUsersArray($sharingEnabled, $pathNew);
|
||||
|
||||
// update sharing-keys
|
||||
$util->setSharedFileKeyfiles($session, $usersSharing, $newPathRelative);
|
||||
$util->setSharedFileKeyfiles($session, $usersSharing, $pathNew);
|
||||
}
|
||||
|
||||
\OC_FileProxy::$enabled = $proxyStatus;
|
||||
|
||||
@@ -59,6 +59,7 @@ class Helper {
|
||||
*/
|
||||
public static function registerFilesystemHooks() {
|
||||
|
||||
\OCP\Util::connectHook('OC_Filesystem', 'rename', 'OCA\Encryption\Hooks', 'preRename');
|
||||
\OCP\Util::connectHook('OC_Filesystem', 'post_rename', 'OCA\Encryption\Hooks', 'postRename');
|
||||
}
|
||||
|
||||
@@ -274,7 +275,7 @@ class Helper {
|
||||
$split = explode('/', $trimmed);
|
||||
|
||||
// it is not a file relative to data/user/files
|
||||
if (count($split) < 2 || $split[1] !== 'files') {
|
||||
if (count($split) < 2 || ($split[1] !== 'files' && $split[1] !== 'cache')) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -370,7 +371,14 @@ class Helper {
|
||||
* @return bool true if requirements are met
|
||||
*/
|
||||
public static function checkRequirements() {
|
||||
return extension_loaded('openssl');
|
||||
$result = true;
|
||||
|
||||
//openssl extension needs to be loaded
|
||||
$result &= extension_loaded("openssl");
|
||||
// we need php >= 5.3.3
|
||||
$result &= version_compare(phpversion(), '5.3.3', '>=');
|
||||
|
||||
return (bool) $result;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -114,6 +114,15 @@ class Proxy extends \OC_FileProxy {
|
||||
// get encrypted content
|
||||
$data = $view->file_get_contents($tmpPath);
|
||||
|
||||
// update file cache for target file
|
||||
$tmpFileInfo = $view->getFileInfo($tmpPath);
|
||||
$fileInfo = $view->getFileInfo($path);
|
||||
if (is_array($fileInfo) && is_array($tmpFileInfo)) {
|
||||
$fileInfo['encrypted'] = true;
|
||||
$fileInfo['unencrypted_size'] = $tmpFileInfo['size'];
|
||||
$view->putFileInfo($path, $fileInfo);
|
||||
}
|
||||
|
||||
// remove our temp file
|
||||
$view->deleteAll('/' . \OCP\User::getUser() . '/cache/' . $cacheFolder);
|
||||
|
||||
@@ -182,8 +191,11 @@ class Proxy extends \OC_FileProxy {
|
||||
*/
|
||||
public function preUnlink($path) {
|
||||
|
||||
// let the trashbin handle this
|
||||
if (\OCP\App::isEnabled('files_trashbin')) {
|
||||
$relPath = Helper::stripUserFilesPath($path);
|
||||
|
||||
// skip this method if the trash bin is enabled or if we delete a file
|
||||
// outside of /data/user/files
|
||||
if (\OCP\App::isEnabled('files_trashbin') || $relPath === false) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -246,8 +258,8 @@ class Proxy extends \OC_FileProxy {
|
||||
// split the path parts
|
||||
$pathParts = explode('/', $path);
|
||||
|
||||
// FIXME: handling for /userId/cache used by webdav for chunking. The cache chunks are NOT encrypted
|
||||
if (isset($pathParts[2]) && $pathParts[2] === 'cache') {
|
||||
// don't try to encrypt/decrypt cache chunks or files in the trash bin
|
||||
if (isset($pathParts[2]) && ($pathParts[2] === 'cache' || $pathParts[2] === 'files_trashbin')) {
|
||||
return $result;
|
||||
}
|
||||
|
||||
|
||||
@@ -101,15 +101,24 @@ class Util {
|
||||
or !$this->view->file_exists($this->publicKeyPath)
|
||||
or !$this->view->file_exists($this->privateKeyPath)
|
||||
) {
|
||||
|
||||
return false;
|
||||
|
||||
} else {
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief check if the users private & public key exists
|
||||
* @return boolean
|
||||
*/
|
||||
public function userKeysExists() {
|
||||
if (
|
||||
$this->view->file_exists($this->privateKeyPath) &&
|
||||
$this->view->file_exists($this->publicKeyPath)) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -232,11 +241,9 @@ class Util {
|
||||
if (\OCP\DB::isError($result)) {
|
||||
\OCP\Util::writeLog('Encryption library', \OC_DB::getErrorMessage($result), \OCP\Util::ERROR);
|
||||
} else {
|
||||
if ($result->numRows() > 0) {
|
||||
$row = $result->fetchRow();
|
||||
if (isset($row['recovery_enabled'])) {
|
||||
$recoveryEnabled[] = $row['recovery_enabled'];
|
||||
}
|
||||
$row = $result->fetchRow();
|
||||
if ($row && isset($row['recovery_enabled'])) {
|
||||
$recoveryEnabled[] = $row['recovery_enabled'];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -280,7 +287,7 @@ class Util {
|
||||
$sql = 'UPDATE `*PREFIX*encryption` SET `recovery_enabled` = ? WHERE `uid` = ?';
|
||||
|
||||
$args = array(
|
||||
$enabled,
|
||||
$enabled ? '1' : '0',
|
||||
$this->userId
|
||||
);
|
||||
|
||||
@@ -455,20 +462,22 @@ class Util {
|
||||
*/
|
||||
public function isEncryptedPath($path) {
|
||||
|
||||
$relPath = Helper::getPathToRealFile($path);
|
||||
// Disable encryption proxy so data retrieved is in its
|
||||
// original form
|
||||
$proxyStatus = \OC_FileProxy::$enabled;
|
||||
\OC_FileProxy::$enabled = false;
|
||||
|
||||
if ($relPath === false) {
|
||||
$relPath = Helper::stripUserFilesPath($path);
|
||||
// we only need 24 byte from the last chunk
|
||||
$data = '';
|
||||
$handle = $this->view->fopen($path, 'r');
|
||||
if (is_resource($handle) && !fseek($handle, -24, SEEK_END)) {
|
||||
$data = fgets($handle);
|
||||
}
|
||||
|
||||
$fileKey = Keymanager::getFileKey($this->view, $this, $relPath);
|
||||
|
||||
if ($fileKey === false) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
// re-enable proxy
|
||||
\OC_FileProxy::$enabled = $proxyStatus;
|
||||
|
||||
return Crypt::isCatfileContent($data);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -761,7 +770,7 @@ class Util {
|
||||
\OC\Files\Filesystem::putFileInfo($relPath, array(
|
||||
'encrypted' => false,
|
||||
'size' => $size,
|
||||
'unencrypted_size' => $size,
|
||||
'unencrypted_size' => 0,
|
||||
'etag' => $fileInfo['etag']
|
||||
));
|
||||
|
||||
@@ -831,32 +840,35 @@ class Util {
|
||||
// Open enc file handle for binary writing, with same filename as original plain file
|
||||
$encHandle = fopen('crypt://' . $rawPath . '.part', 'wb');
|
||||
|
||||
// Move plain file to a temporary location
|
||||
$size = stream_copy_to_stream($plainHandle, $encHandle);
|
||||
if (is_resource($encHandle)) {
|
||||
// Move plain file to a temporary location
|
||||
$size = stream_copy_to_stream($plainHandle, $encHandle);
|
||||
|
||||
fclose($encHandle);
|
||||
fclose($plainHandle);
|
||||
fclose($encHandle);
|
||||
fclose($plainHandle);
|
||||
|
||||
$fakeRoot = $this->view->getRoot();
|
||||
$this->view->chroot('/' . $this->userId . '/files');
|
||||
$fakeRoot = $this->view->getRoot();
|
||||
$this->view->chroot('/' . $this->userId . '/files');
|
||||
|
||||
$this->view->rename($relPath . '.part', $relPath);
|
||||
$this->view->rename($relPath . '.part', $relPath);
|
||||
|
||||
// set timestamp
|
||||
$this->view->touch($relPath, $timestamp);
|
||||
// set timestamp
|
||||
$this->view->touch($relPath, $timestamp);
|
||||
|
||||
$this->view->chroot($fakeRoot);
|
||||
$encSize = $this->view->filesize($relPath);
|
||||
|
||||
// Add the file to the cache
|
||||
\OC\Files\Filesystem::putFileInfo($relPath, array(
|
||||
'encrypted' => true,
|
||||
'size' => $size,
|
||||
'unencrypted_size' => $size,
|
||||
'etag' => $fileInfo['etag']
|
||||
));
|
||||
$this->view->chroot($fakeRoot);
|
||||
|
||||
$encryptedFiles[] = $relPath;
|
||||
// Add the file to the cache
|
||||
\OC\Files\Filesystem::putFileInfo($relPath, array(
|
||||
'encrypted' => true,
|
||||
'size' => $encSize,
|
||||
'unencrypted_size' => $size,
|
||||
'etag' => $fileInfo['etag']
|
||||
));
|
||||
|
||||
$encryptedFiles[] = $relPath;
|
||||
}
|
||||
}
|
||||
|
||||
// Encrypt legacy encrypted files
|
||||
@@ -973,8 +985,8 @@ class Util {
|
||||
if (\OCP\DB::isError($result)) {
|
||||
\OCP\Util::writeLog('Encryption library', \OC_DB::getErrorMessage($result), \OCP\Util::ERROR);
|
||||
} else {
|
||||
if ($result->numRows() > 0) {
|
||||
$row = $result->fetchRow();
|
||||
$row = $result->fetchRow();
|
||||
if ($row) {
|
||||
$path = substr($row['path'], strlen('files'));
|
||||
}
|
||||
}
|
||||
@@ -1254,11 +1266,9 @@ class Util {
|
||||
if (\OCP\DB::isError($result)) {
|
||||
\OCP\Util::writeLog('Encryption library', \OC_DB::getErrorMessage($result), \OCP\Util::ERROR);
|
||||
} else {
|
||||
if ($result->numRows() > 0) {
|
||||
$row = $result->fetchRow();
|
||||
if (isset($row['migration_status'])) {
|
||||
$migrationStatus[] = $row['migration_status'];
|
||||
}
|
||||
$row = $result->fetchRow();
|
||||
if ($row && isset($row['migration_status'])) {
|
||||
$migrationStatus[] = $row['migration_status'];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1438,9 +1448,7 @@ class Util {
|
||||
if (\OCP\DB::isError($result)) {
|
||||
\OCP\Util::writeLog('Encryption library', \OC_DB::getErrorMessage($result), \OCP\Util::ERROR);
|
||||
} else {
|
||||
if ($result->numRows() > 0) {
|
||||
$row = $result->fetchRow();
|
||||
}
|
||||
$row = $result->fetchRow();
|
||||
}
|
||||
|
||||
return $row;
|
||||
@@ -1464,9 +1472,7 @@ class Util {
|
||||
if (\OCP\DB::isError($result)) {
|
||||
\OCP\Util::writeLog('Encryption library', \OC_DB::getErrorMessage($result), \OCP\Util::ERROR);
|
||||
} else {
|
||||
if ($result->numRows() > 0) {
|
||||
$row = $result->fetchRow();
|
||||
}
|
||||
$row = $result->fetchRow();
|
||||
}
|
||||
|
||||
return $row;
|
||||
@@ -1485,18 +1491,16 @@ class Util {
|
||||
|
||||
$result = $query->execute(array($id));
|
||||
|
||||
$source = array();
|
||||
$source = null;
|
||||
if (\OCP\DB::isError($result)) {
|
||||
\OCP\Util::writeLog('Encryption library', \OC_DB::getErrorMessage($result), \OCP\Util::ERROR);
|
||||
} else {
|
||||
if ($result->numRows() > 0) {
|
||||
$source = $result->fetchRow();
|
||||
}
|
||||
$source = $result->fetchRow();
|
||||
}
|
||||
|
||||
$fileOwner = false;
|
||||
|
||||
if (isset($source['parent'])) {
|
||||
if ($source && isset($source['parent'])) {
|
||||
|
||||
$parent = $source['parent'];
|
||||
|
||||
@@ -1506,16 +1510,14 @@ class Util {
|
||||
|
||||
$result = $query->execute(array($parent));
|
||||
|
||||
$item = array();
|
||||
$item = null;
|
||||
if (\OCP\DB::isError($result)) {
|
||||
\OCP\Util::writeLog('Encryption library', \OC_DB::getErrorMessage($result), \OCP\Util::ERROR);
|
||||
} else {
|
||||
if ($result->numRows() > 0) {
|
||||
$item = $result->fetchRow();
|
||||
}
|
||||
$item = $result->fetchRow();
|
||||
}
|
||||
|
||||
if (isset($item['parent'])) {
|
||||
if ($item && isset($item['parent'])) {
|
||||
|
||||
$parent = $item['parent'];
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<fieldset class="personalblock">
|
||||
<h2><?php p( $l->t( 'Encryption' ) ); ?></h2>
|
||||
|
||||
<?php if ( ! $_["privateKeySet"] && $_["initialized"] ): ?>
|
||||
<?php if ( $_["initialized"] === '1' ): ?>
|
||||
<p>
|
||||
<a name="changePKPasswd" />
|
||||
<label for="changePrivateKeyPasswd">
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
|
||||
|
||||
require_once __DIR__ . '/../lib/helper.php';
|
||||
require_once __DIR__ . '/util.php';
|
||||
|
||||
use OCA\Encryption;
|
||||
|
||||
@@ -16,6 +17,18 @@ use OCA\Encryption;
|
||||
*/
|
||||
class Test_Encryption_Helper extends \PHPUnit_Framework_TestCase {
|
||||
|
||||
const TEST_ENCRYPTION_HELPER_USER1 = "test-helper-user1";
|
||||
|
||||
public static function setUpBeforeClass() {
|
||||
// create test user
|
||||
\Test_Encryption_Util::loginHelper(\Test_Encryption_Helper::TEST_ENCRYPTION_HELPER_USER1, true);
|
||||
}
|
||||
|
||||
public static function tearDownAfterClass() {
|
||||
// cleanup test user
|
||||
\OC_User::deleteUser(\Test_Encryption_Helper::TEST_ENCRYPTION_HELPER_USER1);
|
||||
}
|
||||
|
||||
/**
|
||||
* @medium
|
||||
*/
|
||||
@@ -64,4 +77,28 @@ class Test_Encryption_Helper extends \PHPUnit_Framework_TestCase {
|
||||
$this->assertEquals($relativePath, Encryption\Helper::getPathToRealFile($cachePath));
|
||||
}
|
||||
|
||||
function testGetUser() {
|
||||
|
||||
$path1 = "/" . self::TEST_ENCRYPTION_HELPER_USER1 . "/files/foo/bar.txt";
|
||||
$path2 = "/" . self::TEST_ENCRYPTION_HELPER_USER1 . "/cache/foo/bar.txt";
|
||||
$path3 = "/" . self::TEST_ENCRYPTION_HELPER_USER1 . "/thumbnails/foo";
|
||||
$path4 ="/" . "/" . self::TEST_ENCRYPTION_HELPER_USER1;
|
||||
|
||||
// if we are logged-in every path should return the currently logged-in user
|
||||
$this->assertEquals(self::TEST_ENCRYPTION_HELPER_USER1, Encryption\Helper::getUser($path3));
|
||||
|
||||
// now log out
|
||||
\Test_Encryption_Util::logoutHelper();
|
||||
|
||||
// now we should only get the user from /user/files and user/cache paths
|
||||
$this->assertEquals(self::TEST_ENCRYPTION_HELPER_USER1, Encryption\Helper::getUser($path1));
|
||||
$this->assertEquals(self::TEST_ENCRYPTION_HELPER_USER1, Encryption\Helper::getUser($path2));
|
||||
|
||||
$this->assertFalse(Encryption\Helper::getUser($path3));
|
||||
$this->assertFalse(Encryption\Helper::getUser($path4));
|
||||
|
||||
// Log-in again
|
||||
\Test_Encryption_Util::loginHelper(\Test_Encryption_Helper::TEST_ENCRYPTION_HELPER_USER1);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -44,8 +44,10 @@ class Test_Encryption_Proxy extends \PHPUnit_Framework_TestCase {
|
||||
/**
|
||||
* @var \OC_FilesystemView
|
||||
*/
|
||||
public $view;
|
||||
public $view; // view in /data/user/files
|
||||
public $rootView; // view on /data/user
|
||||
public $data;
|
||||
public $filename;
|
||||
|
||||
public static function setUpBeforeClass() {
|
||||
// reset backend
|
||||
@@ -74,9 +76,12 @@ class Test_Encryption_Proxy extends \PHPUnit_Framework_TestCase {
|
||||
|
||||
// init filesystem view
|
||||
$this->view = new \OC_FilesystemView('/'. \Test_Encryption_Proxy::TEST_ENCRYPTION_PROXY_USER1 . '/files');
|
||||
$this->rootView = new \OC_FilesystemView('/'. \Test_Encryption_Proxy::TEST_ENCRYPTION_PROXY_USER1 );
|
||||
|
||||
// init short data
|
||||
$this->data = 'hats';
|
||||
$this->filename = 'enc_proxy_tests-' . time() . '.txt';
|
||||
|
||||
}
|
||||
|
||||
public static function tearDownAfterClass() {
|
||||
@@ -90,21 +95,71 @@ class Test_Encryption_Proxy extends \PHPUnit_Framework_TestCase {
|
||||
*/
|
||||
function testPostFileSize() {
|
||||
|
||||
// generate filename
|
||||
$filename = 'tmp-' . time() . '.txt';
|
||||
|
||||
$this->view->file_put_contents($filename, $this->data);
|
||||
$this->view->file_put_contents($this->filename, $this->data);
|
||||
|
||||
\OC_FileProxy::$enabled = false;
|
||||
|
||||
$unencryptedSize = $this->view->filesize($filename);
|
||||
$unencryptedSize = $this->view->filesize($this->filename);
|
||||
|
||||
\OC_FileProxy::$enabled = true;
|
||||
|
||||
$encryptedSize = $this->view->filesize($filename);
|
||||
$encryptedSize = $this->view->filesize($this->filename);
|
||||
|
||||
$this->assertTrue($encryptedSize !== $unencryptedSize);
|
||||
|
||||
// cleanup
|
||||
$this->view->unlink($this->filename);
|
||||
|
||||
}
|
||||
|
||||
function testPreUnlinkWithoutTrash() {
|
||||
|
||||
// remember files_trashbin state
|
||||
$stateFilesTrashbin = OC_App::isEnabled('files_trashbin');
|
||||
|
||||
// we want to tests with app files_trashbin enabled
|
||||
\OC_App::disable('files_trashbin');
|
||||
|
||||
$this->view->file_put_contents($this->filename, $this->data);
|
||||
|
||||
// create a dummy file that we can delete something outside of data/user/files
|
||||
$this->rootView->file_put_contents("dummy.txt", $this->data);
|
||||
|
||||
// check if all keys are generated
|
||||
$this->assertTrue($this->rootView->file_exists(
|
||||
'/files_encryption/share-keys/'
|
||||
. $this->filename . '.' . \Test_Encryption_Proxy::TEST_ENCRYPTION_PROXY_USER1 . '.shareKey'));
|
||||
$this->assertTrue($this->rootView->file_exists(
|
||||
'/files_encryption/keyfiles/' . $this->filename . '.key'));
|
||||
|
||||
|
||||
// delete dummy file outside of data/user/files
|
||||
$this->rootView->unlink("dummy.txt");
|
||||
|
||||
// all keys should still exist
|
||||
$this->assertTrue($this->rootView->file_exists(
|
||||
'/files_encryption/share-keys/'
|
||||
. $this->filename . '.' . \Test_Encryption_Proxy::TEST_ENCRYPTION_PROXY_USER1 . '.shareKey'));
|
||||
$this->assertTrue($this->rootView->file_exists(
|
||||
'/files_encryption/keyfiles/' . $this->filename . '.key'));
|
||||
|
||||
|
||||
// delete the file in data/user/files
|
||||
$this->view->unlink($this->filename);
|
||||
|
||||
// now also the keys should be gone
|
||||
$this->assertFalse($this->rootView->file_exists(
|
||||
'/files_encryption/share-keys/'
|
||||
. $this->filename . '.' . \Test_Encryption_Proxy::TEST_ENCRYPTION_PROXY_USER1 . '.shareKey'));
|
||||
$this->assertFalse($this->rootView->file_exists(
|
||||
'/files_encryption/keyfiles/' . $this->filename . '.key'));
|
||||
|
||||
if ($stateFilesTrashbin) {
|
||||
OC_App::enable('files_trashbin');
|
||||
}
|
||||
else {
|
||||
OC_App::disable('files_trashbin');
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -649,9 +649,7 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
|
||||
* @large
|
||||
*/
|
||||
function testRecoveryFile() {
|
||||
$this->markTestIncomplete(
|
||||
'No idea what\'s wrong here, this works perfectly in real-world. removeRecoveryKeys(\'/\') L709 removes correctly the keys, but for some reasons afterwards also the top-level folder "share-keys" is gone...'
|
||||
);
|
||||
|
||||
// login as admin
|
||||
\Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1);
|
||||
|
||||
@@ -754,13 +752,13 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
|
||||
* @large
|
||||
*/
|
||||
function testRecoveryForUser() {
|
||||
$this->markTestIncomplete(
|
||||
'This test drives Jenkins crazy - "Cannot modify header information - headers already sent" - line 811'
|
||||
);
|
||||
|
||||
// login as admin
|
||||
\Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1);
|
||||
|
||||
\OCA\Encryption\Helper::adminEnableRecovery(null, 'test123');
|
||||
$result = \OCA\Encryption\Helper::adminEnableRecovery(null, 'test123');
|
||||
$this->assertTrue($result);
|
||||
|
||||
$recoveryKeyId = OC_Appconfig::getValue('files_encryption', 'recoveryKeyId');
|
||||
|
||||
// login as user2
|
||||
@@ -771,6 +769,9 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
|
||||
// enable recovery for admin
|
||||
$this->assertTrue($util->setRecoveryForUser(1));
|
||||
|
||||
// add recovery keys for existing files (e.g. the auto-generated welcome.txt)
|
||||
$util->addRecoveryKeys();
|
||||
|
||||
// create folder structure
|
||||
$this->view->mkdir('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files' . $this->folder1);
|
||||
$this->view->mkdir(
|
||||
@@ -809,6 +810,10 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
|
||||
|
||||
// change password
|
||||
\OC_User::setPassword(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2, 'test', 'test123');
|
||||
$params = array('uid' => \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2,
|
||||
'password' => 'test',
|
||||
'recoveryPassword' => 'test123');
|
||||
\OCA\Encryption\Hooks::setPassphrase($params);
|
||||
|
||||
// login as user2
|
||||
\Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2, false, 'test');
|
||||
@@ -823,8 +828,8 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
|
||||
$this->assertEquals($this->dataShort, $retrievedCryptedFile2);
|
||||
|
||||
// cleanup
|
||||
$this->view->unlink('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files' . $this->folder1);
|
||||
$this->view->unlink('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files' . $this->filename);
|
||||
$this->view->unlink('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files/' . $this->folder1);
|
||||
$this->view->unlink('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files/' . $this->filename);
|
||||
|
||||
// check if share key for user and recovery exists
|
||||
$this->assertFalse($this->view->file_exists(
|
||||
@@ -889,8 +894,8 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
|
||||
} catch (Exception $e) {
|
||||
$this->assertEquals(0, strpos($e->getMessage(), "Following users are not set up for encryption"));
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// login as admin
|
||||
\Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1);
|
||||
|
||||
|
||||
@@ -416,6 +416,12 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase {
|
||||
OCA\Encryption\Hooks::login($params);
|
||||
}
|
||||
|
||||
public static function logoutHelper() {
|
||||
\OC_Util::tearDownFS();
|
||||
\OC_User::setUserId('');
|
||||
\OC\Files\Filesystem::tearDown();
|
||||
}
|
||||
|
||||
/**
|
||||
* helper function to set migration status to the right value
|
||||
* to be able to test the migration path
|
||||
|
||||
+5
-1
@@ -19,6 +19,10 @@
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# Addition 17/12/2012 Frank Karlitschek (frank@owncloud.org)
|
||||
# On the official website http://www.phpclasses.org/smb4php the
|
||||
# license is listed as LGPL so we assume that this is
|
||||
# dual-licensed GPL/LGPL
|
||||
###################################################################
|
||||
|
||||
define ('SMB4PHP_VERSION', '0.8');
|
||||
@@ -126,7 +130,7 @@ class smb {
|
||||
// this put env is necessary to read the output of smbclient correctly
|
||||
$old_locale = getenv('LC_ALL');
|
||||
putenv('LC_ALL=en_US.UTF-8');
|
||||
$output = popen (SMB4PHP_SMBCLIENT." -N {$auth} {$options} {$port} {$options} {$params} 2>/dev/null", 'r');
|
||||
$output = popen ('TZ=UTC '.SMB4PHP_SMBCLIENT." -N {$auth} {$options} {$port} {$options} {$params} 2>/dev/null", 'r');
|
||||
$gotInfo = false;
|
||||
$info = array ();
|
||||
$info['info']= array ();
|
||||
|
||||
@@ -23,9 +23,12 @@ $(document).ready(function() {
|
||||
$(token).val(result.access_token);
|
||||
$(token_secret).val(result.access_token_secret);
|
||||
$(configured).val('true');
|
||||
OC.MountConfig.saveStorage(tr);
|
||||
$(tr).find('.configuration input').attr('disabled', 'disabled');
|
||||
$(tr).find('.configuration').append('<span id="access" style="padding-left:0.5em;">'+t('files_external', 'Access granted')+'</span>');
|
||||
OC.MountConfig.saveStorage(tr, function(status) {
|
||||
if (status) {
|
||||
$(tr).find('.configuration input').attr('disabled', 'disabled');
|
||||
$(tr).find('.configuration').append('<span id="access" style="padding-left:0.5em;">'+t('files_external', 'Access granted')+'</span>');
|
||||
}
|
||||
});
|
||||
} else {
|
||||
OC.dialogs.alert(result.data.message, t('files_external', 'Error configuring Dropbox storage'));
|
||||
}
|
||||
@@ -77,7 +80,6 @@ $(document).ready(function() {
|
||||
var tr = $(this).parent().parent();
|
||||
var app_key = $(this).parent().find('[data-parameter="app_key"]').val();
|
||||
var app_secret = $(this).parent().find('[data-parameter="app_secret"]').val();
|
||||
var statusSpan = $(tr).find('.status span');
|
||||
if (app_key != '' && app_secret != '') {
|
||||
var tr = $(this).parent().parent();
|
||||
var configured = $(this).parent().find('[data-parameter="configured"]');
|
||||
@@ -88,10 +90,9 @@ $(document).ready(function() {
|
||||
$(configured).val('false');
|
||||
$(token).val(result.data.request_token);
|
||||
$(token_secret).val(result.data.request_token_secret);
|
||||
OC.MountConfig.saveStorage(tr);
|
||||
statusSpan.removeClass();
|
||||
statusSpan.addClass('waiting');
|
||||
window.location = result.data.url;
|
||||
OC.MountConfig.saveStorage(tr, function() {
|
||||
window.location = result.data.url;
|
||||
});
|
||||
} else {
|
||||
OC.dialogs.alert(result.data.message, t('files_external', 'Error configuring Dropbox storage'));
|
||||
}
|
||||
|
||||
@@ -32,11 +32,14 @@ $(document).ready(function() {
|
||||
if (result && result.status == 'success') {
|
||||
$(token).val(result.data.token);
|
||||
$(configured).val('true');
|
||||
OC.MountConfig.saveStorage(tr);
|
||||
$(tr).find('.configuration input').attr('disabled', 'disabled');
|
||||
$(tr).find('.configuration').append($('<span/>')
|
||||
.attr('id', 'access')
|
||||
.text(t('files_external', 'Access granted')));
|
||||
OC.MountConfig.saveStorage(tr, function(status) {
|
||||
if (status) {
|
||||
$(tr).find('.configuration input').attr('disabled', 'disabled');
|
||||
$(tr).find('.configuration').append($('<span/>')
|
||||
.attr('id', 'access')
|
||||
.text(t('files_external', 'Access granted')));
|
||||
}
|
||||
});
|
||||
} else {
|
||||
OC.dialogs.alert(result.data.message,
|
||||
t('files_external', 'Error configuring Google Drive storage')
|
||||
@@ -99,7 +102,6 @@ $(document).ready(function() {
|
||||
var configured = $(this).parent().find('[data-parameter="configured"]');
|
||||
var client_id = $(this).parent().find('[data-parameter="client_id"]').val();
|
||||
var client_secret = $(this).parent().find('[data-parameter="client_secret"]').val();
|
||||
var statusSpan = $(tr).find('.status span');
|
||||
if (client_id != '' && client_secret != '') {
|
||||
var token = $(this).parent().find('[data-parameter="token"]');
|
||||
$.post(OC.filePath('files_external', 'ajax', 'google.php'),
|
||||
@@ -112,10 +114,9 @@ $(document).ready(function() {
|
||||
if (result && result.status == 'success') {
|
||||
$(configured).val('false');
|
||||
$(token).val('false');
|
||||
OC.MountConfig.saveStorage(tr);
|
||||
statusSpan.removeClass();
|
||||
statusSpan.addClass('waiting');
|
||||
window.location = result.data.url;
|
||||
OC.MountConfig.saveStorage(tr, function(status) {
|
||||
window.location = result.data.url;
|
||||
});
|
||||
} else {
|
||||
OC.dialogs.alert(result.data.message,
|
||||
t('files_external', 'Error configuring Google Drive storage')
|
||||
|
||||
@@ -12,7 +12,7 @@ function updateStatus(statusEl, result){
|
||||
}
|
||||
|
||||
OC.MountConfig={
|
||||
saveStorage:function(tr) {
|
||||
saveStorage:function(tr, callback) {
|
||||
var mountPoint = $(tr).find('.mountPoint input').val();
|
||||
if (mountPoint == '') {
|
||||
return false;
|
||||
@@ -84,9 +84,15 @@ OC.MountConfig={
|
||||
},
|
||||
success: function(result) {
|
||||
status = updateStatus(statusSpan, result);
|
||||
if (callback) {
|
||||
callback(status);
|
||||
}
|
||||
},
|
||||
error: function(result){
|
||||
status = updateStatus(statusSpan, result);
|
||||
if (callback) {
|
||||
callback(status);
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
@@ -137,9 +143,15 @@ OC.MountConfig={
|
||||
},
|
||||
success: function(result) {
|
||||
status = updateStatus(statusSpan, result);
|
||||
if (callback) {
|
||||
callback(status);
|
||||
}
|
||||
},
|
||||
error: function(result){
|
||||
status = updateStatus(statusSpan, result);
|
||||
if (callback) {
|
||||
callback(status);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
<?php
|
||||
$TRANSLATIONS = array(
|
||||
"Options" => "Опции",
|
||||
"Delete" => "Удалить"
|
||||
);
|
||||
$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);";
|
||||
@@ -81,9 +81,9 @@ class AmazonS3 extends \OC\Files\Storage\Common {
|
||||
$scheme = ($params['use_ssl'] === 'false') ? 'http' : 'https';
|
||||
$this->test = isset($params['test']);
|
||||
$this->timeout = ( ! isset($params['timeout'])) ? 15 : $params['timeout'];
|
||||
$params['region'] = ( ! isset($params['region'])) ? 'eu-west-1' : $params['region'];
|
||||
$params['hostname'] = ( !isset($params['hostname'])) ? 's3.amazonaws.com' : $params['hostname'];
|
||||
if (!isset($params['port'])) {
|
||||
$params['region'] = ( ! isset($params['region']) || $params['region'] === '' ) ? 'eu-west-1' : $params['region'];
|
||||
$params['hostname'] = ( !isset($params['hostname']) || $params['hostname'] === '' ) ? 's3.amazonaws.com' : $params['hostname'];
|
||||
if (!isset($params['port']) || $params['port'] === '') {
|
||||
$params['port'] = ($params['use_ssl'] === 'false') ? 80 : 443;
|
||||
}
|
||||
$base_url = $scheme.'://'.$params['hostname'].':'.$params['port'].'/';
|
||||
@@ -507,8 +507,10 @@ class AmazonS3 extends \OC\Files\Storage\Common {
|
||||
}
|
||||
|
||||
public function test() {
|
||||
$test = $this->s3->get_canonical_user_id();
|
||||
if (isset($test['id']) && $test['id'] != '') {
|
||||
$test = $this->connection->getBucketAcl(array(
|
||||
'Bucket' => $this->bucket,
|
||||
));
|
||||
if (isset($test) && !is_null($test->getPath('Owner/ID'))) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
||||
@@ -50,9 +50,9 @@ class OC_Mount_Config {
|
||||
'key' => 'Access Key',
|
||||
'secret' => '*Secret Key',
|
||||
'bucket' => 'Bucket',
|
||||
'hostname' => 'Hostname (optional)',
|
||||
'port' => 'Port (optional)',
|
||||
'region' => 'Region (optional)',
|
||||
'hostname' => '&Hostname (optional)',
|
||||
'port' => '&Port (optional)',
|
||||
'region' => '&Region (optional)',
|
||||
'use_ssl' => '!Enable SSL',
|
||||
'use_path_style' => '!Enable Path Style'));
|
||||
|
||||
@@ -244,6 +244,7 @@ class OC_Mount_Config {
|
||||
$storage = new $class($options);
|
||||
return $storage->test();
|
||||
} catch (Exception $exception) {
|
||||
\OCP\Util::logException('files_external', $exception);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -381,8 +382,7 @@ class OC_Mount_Config {
|
||||
* @return array
|
||||
*/
|
||||
public static function getCertificates() {
|
||||
$view = \OCP\Files::getStorage('files_external');
|
||||
$path=\OCP\Config::getSystemValue('datadirectory').$view->getAbsolutePath("").'uploads/';
|
||||
$path=OC_User::getHome(OC_User::getUser()) . '/files_external/uploads/';
|
||||
\OCP\Util::writeLog('files_external', 'checking path '.$path, \OCP\Util::INFO);
|
||||
if ( ! is_dir($path)) {
|
||||
//path might not exist (e.g. non-standard OC_User::getHome() value)
|
||||
@@ -404,8 +404,7 @@ class OC_Mount_Config {
|
||||
* creates certificate bundle
|
||||
*/
|
||||
public static function createCertificateBundle() {
|
||||
$view = \OCP\Files::getStorage("files_external");
|
||||
$path = \OCP\Config::getSystemValue('datadirectory').$view->getAbsolutePath("");
|
||||
$path=OC_User::getHome(OC_User::getUser()) . '/files_external';
|
||||
|
||||
$certs = OC_Mount_Config::getCertificates();
|
||||
$fh_certs = fopen($path."/rootcerts.crt", 'w');
|
||||
|
||||
@@ -14,6 +14,7 @@ class DAV extends \OC\Files\Storage\Common{
|
||||
private $host;
|
||||
private $secure;
|
||||
private $root;
|
||||
private $certPath;
|
||||
private $ready;
|
||||
/**
|
||||
* @var \Sabre_DAV_Client
|
||||
@@ -40,6 +41,12 @@ class DAV extends \OC\Files\Storage\Common{
|
||||
} else {
|
||||
$this->secure = false;
|
||||
}
|
||||
if ($this->secure === true) {
|
||||
$certPath=\OC_User::getHome(\OC_User::getUser()) . '/files_external/rootcerts.crt';
|
||||
if (file_exists($certPath)) {
|
||||
$this->certPath=$certPath;
|
||||
}
|
||||
}
|
||||
$this->root=isset($params['root'])?$params['root']:'/';
|
||||
if ( ! $this->root || $this->root[0]!='/') {
|
||||
$this->root='/'.$this->root;
|
||||
@@ -58,20 +65,16 @@ class DAV extends \OC\Files\Storage\Common{
|
||||
}
|
||||
$this->ready = true;
|
||||
|
||||
$settings = array(
|
||||
'baseUri' => $this->createBaseUri(),
|
||||
'userName' => $this->user,
|
||||
'password' => $this->password,
|
||||
);
|
||||
$settings = array(
|
||||
'baseUri' => $this->createBaseUri(),
|
||||
'userName' => $this->user,
|
||||
'password' => $this->password,
|
||||
);
|
||||
|
||||
$this->client = new \Sabre_DAV_Client($settings);
|
||||
|
||||
$caview = \OCP\Files::getStorage('files_external');
|
||||
if ($caview) {
|
||||
$certPath=\OCP\Config::getSystemValue('datadirectory').$caview->getAbsolutePath("").'rootcerts.crt';
|
||||
if (file_exists($certPath)) {
|
||||
$this->client->addTrustedCertificates($certPath);
|
||||
}
|
||||
if ($this->secure === true && $this->certPath) {
|
||||
$this->client->addTrustedCertificates($this->certPath);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -166,7 +169,14 @@ class DAV extends \OC\Files\Storage\Common{
|
||||
curl_setopt($curl, CURLOPT_URL, $this->createBaseUri().str_replace(' ', '%20', $path));
|
||||
curl_setopt($curl, CURLOPT_FILE, $fp);
|
||||
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
|
||||
|
||||
if ($this->secure === true) {
|
||||
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
|
||||
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
|
||||
if($this->certPath){
|
||||
curl_setopt($curl, CURLOPT_CAINFO, $this->certPath);
|
||||
}
|
||||
}
|
||||
|
||||
curl_exec ($curl);
|
||||
curl_close ($curl);
|
||||
rewind($fp);
|
||||
@@ -254,6 +264,13 @@ class DAV extends \OC\Files\Storage\Common{
|
||||
curl_setopt($curl, CURLOPT_INFILE, $source); // file pointer
|
||||
curl_setopt($curl, CURLOPT_INFILESIZE, filesize($path));
|
||||
curl_setopt($curl, CURLOPT_PUT, true);
|
||||
if ($this->secure === true) {
|
||||
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
|
||||
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
|
||||
if($this->certPath){
|
||||
curl_setopt($curl, CURLOPT_CAINFO, $this->certPath);
|
||||
}
|
||||
}
|
||||
curl_exec ($curl);
|
||||
curl_close ($curl);
|
||||
}
|
||||
@@ -331,3 +348,4 @@ class DAV extends \OC\Files\Storage\Common{
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
class="optional"
|
||||
data-parameter="<?php p($parameter); ?>"
|
||||
value="<?php p($value); ?>"
|
||||
placeholder="<?php p(substr($placeholder, 5)); ?>" />
|
||||
placeholder="<?php p(substr($placeholder, 1)); ?>" />
|
||||
<?php elseif (strpos($placeholder, '#') !== false): ?>
|
||||
<input type="hidden"
|
||||
data-parameter="<?php p($parameter); ?>"
|
||||
|
||||
@@ -36,7 +36,9 @@ if(!isset($linkedItem['uid_owner']) || !isset($linkedItem['file_source'])) {
|
||||
exit;
|
||||
}
|
||||
|
||||
$userId = $linkedItem['uid_owner'];
|
||||
$rootLinkItem = OCP\Share::resolveReShare($linkedItem);
|
||||
$userId = $rootLinkItem['uid_owner'];
|
||||
|
||||
\OC_Util::setupFS($userId);
|
||||
\OC\Files\Filesystem::initMountPoints($userId);
|
||||
$view = new \OC\Files\View('/' . $userId . '/files');
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
body {
|
||||
background:#ddd;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
#header {
|
||||
@@ -22,7 +22,7 @@ body {
|
||||
#public_upload,
|
||||
#download {
|
||||
font-weight:700;
|
||||
margin: 0 0.4em 0 0;
|
||||
margin: 0 0 0 .4em;
|
||||
padding: 0 5px;
|
||||
height: 32px;
|
||||
float: left;
|
||||
@@ -49,12 +49,14 @@ body {
|
||||
vertical-align:text-bottom;
|
||||
}
|
||||
|
||||
#controls {
|
||||
left: 0;
|
||||
}
|
||||
|
||||
#preview {
|
||||
background:#eee;
|
||||
border-bottom:1px solid #f8f8f8;
|
||||
min-height:30em;
|
||||
text-align:center;
|
||||
margin:45px auto;
|
||||
background: #fff;
|
||||
text-align: center;
|
||||
margin: 45px auto 0;
|
||||
}
|
||||
|
||||
#noPreview {
|
||||
@@ -62,11 +64,16 @@ body {
|
||||
padding-top:5em;
|
||||
}
|
||||
|
||||
footer {
|
||||
margin-top: 45px;
|
||||
}
|
||||
|
||||
p.info {
|
||||
color:#777;
|
||||
text-align:center;
|
||||
width:22em;
|
||||
margin:2em auto;
|
||||
color: #777;
|
||||
text-align: center;
|
||||
width: 22em;
|
||||
margin: 0 auto;
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
p.info a {
|
||||
|
||||
@@ -29,19 +29,19 @@ $(document).ready(function() {
|
||||
}
|
||||
}
|
||||
FileActions.register('dir', 'Open', OC.PERMISSION_READ, '', function(filename) {
|
||||
var tr = $('tr').filterAttr('data-file', filename);
|
||||
var tr = FileList.findFileEl(filename);
|
||||
if (tr.length > 0) {
|
||||
window.location = $(tr).find('a.name').attr('href');
|
||||
}
|
||||
});
|
||||
FileActions.register('file', 'Download', OC.PERMISSION_READ, '', function(filename) {
|
||||
var tr = $('tr').filterAttr('data-file', filename);
|
||||
var tr = FileList.findFileEl(filename);
|
||||
if (tr.length > 0) {
|
||||
window.location = $(tr).find('a.name').attr('href');
|
||||
}
|
||||
});
|
||||
FileActions.register('dir', 'Download', OC.PERMISSION_READ, '', function(filename) {
|
||||
var tr = $('tr').filterAttr('data-file', filename);
|
||||
var tr = FileList.findFileEl(filename);
|
||||
if (tr.length > 0) {
|
||||
window.location = $(tr).find('a.name').attr('href')+'&download';
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@ $(document).ready(function() {
|
||||
} else {
|
||||
var item = $('#dir').val() + '/' + filename;
|
||||
}
|
||||
var tr = $('tr').filterAttr('data-file', filename);
|
||||
var tr = FileList.findFileEl(filename);
|
||||
if ($(tr).data('type') == 'dir') {
|
||||
var itemType = 'folder';
|
||||
} else {
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
<?php
|
||||
$TRANSLATIONS = array(
|
||||
"Password" => "Пароль",
|
||||
"Download" => "Загрузка",
|
||||
"Upload" => "Загрузка",
|
||||
"Cancel upload" => "Отмена загрузки"
|
||||
);
|
||||
$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);";
|
||||
@@ -172,7 +172,7 @@ class OC_Share_Backend_File implements OCP\Share_Backend_File_Dependent {
|
||||
$source['fileOwner'] = $fileOwner;
|
||||
return $source;
|
||||
}
|
||||
\OCP\Util::writeLog('files_sharing', 'File source not found for: '.$target, \OCP\Util::ERROR);
|
||||
\OCP\Util::writeLog('files_sharing', 'File source not found for: '.$target, \OCP\Util::DEBUG);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -279,43 +279,26 @@ class Shared extends \OC\Files\Storage\Common {
|
||||
if ($this->isDeletable($path)) {
|
||||
list($storage, $internalPath) = \OC\Files\Filesystem::resolvePath($source);
|
||||
return $storage->unlink($internalPath);
|
||||
} else if (dirname($path) == '/' || dirname($path) == '.') {
|
||||
// Unshare the file from the user if in the root of the Shared folder
|
||||
if ($this->is_dir($path)) {
|
||||
$itemType = 'folder';
|
||||
} else {
|
||||
$itemType = 'file';
|
||||
}
|
||||
return \OCP\Share::unshareFromSelf($itemType, $path);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public function rename($path1, $path2) {
|
||||
// Check for partial files
|
||||
if (pathinfo($path1, PATHINFO_EXTENSION) === 'part') {
|
||||
if ($oldSource = $this->getSourcePath($path1)) {
|
||||
// Renaming/moving is only allowed within shared folders
|
||||
$pos1 = strpos($path1, '/', 1);
|
||||
$pos2 = strpos($path2, '/', 1);
|
||||
if ($pos1 !== false && $pos2 !== false && ($oldSource = $this->getSourcePath($path1))) {
|
||||
$newSource = $this->getSourcePath(dirname($path2)) . '/' . basename($path2);
|
||||
// Within the same folder, we only need UPDATE permissions
|
||||
if (dirname($path1) == dirname($path2) and $this->isUpdatable($path1)) {
|
||||
list($storage, $oldInternalPath) = \OC\Files\Filesystem::resolvePath($oldSource);
|
||||
$newInternalPath = substr($oldInternalPath, 0, -5);
|
||||
list(, $newInternalPath) = \OC\Files\Filesystem::resolvePath($newSource);
|
||||
return $storage->rename($oldInternalPath, $newInternalPath);
|
||||
}
|
||||
} else {
|
||||
// Renaming/moving is only allowed within shared folders
|
||||
$pos1 = strpos($path1, '/', 1);
|
||||
$pos2 = strpos($path2, '/', 1);
|
||||
if ($pos1 !== false && $pos2 !== false && ($oldSource = $this->getSourcePath($path1))) {
|
||||
$newSource = $this->getSourcePath(dirname($path2)) . '/' . basename($path2);
|
||||
// Within the same folder, we only need UPDATE permissions
|
||||
if (dirname($path1) == dirname($path2) and $this->isUpdatable($path1)) {
|
||||
list($storage, $oldInternalPath) = \OC\Files\Filesystem::resolvePath($oldSource);
|
||||
list(, $newInternalPath) = \OC\Files\Filesystem::resolvePath($newSource);
|
||||
return $storage->rename($oldInternalPath, $newInternalPath);
|
||||
// otherwise DELETE and CREATE permissions required
|
||||
} elseif ($this->isDeletable($path1) && $this->isCreatable(dirname($path2))) {
|
||||
$rootView = new \OC\Files\View('');
|
||||
return $rootView->rename($oldSource, $newSource);
|
||||
}
|
||||
// otherwise DELETE and CREATE permissions required
|
||||
} elseif ($this->isDeletable($path1) && $this->isCreatable(dirname($path2))) {
|
||||
$rootView = new \OC\Files\View('');
|
||||
return $rootView->rename($oldSource, $newSource);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
|
||||
@@ -112,8 +112,12 @@ class Shared_Updater {
|
||||
*/
|
||||
static public function shareHook($params) {
|
||||
if ($params['itemType'] === 'file' || $params['itemType'] === 'folder') {
|
||||
$uidOwner = \OCP\User::getUser();
|
||||
$users = \OCP\Share::getUsersItemShared($params['itemType'], $params['fileSource'], $uidOwner, true);
|
||||
if (isset($params['uidOwner'])) {
|
||||
$uidOwner = $params['uidOwner'];
|
||||
} else {
|
||||
$uidOwner = \OCP\User::getUser();
|
||||
}
|
||||
$users = \OCP\Share::getUsersItemShared($params['itemType'], $params['fileSource'], $uidOwner, true, false);
|
||||
if (!empty($users)) {
|
||||
while (!empty($users)) {
|
||||
$reshareUsers = array();
|
||||
|
||||
@@ -132,8 +132,8 @@ abstract class Test_Files_Sharing_Base extends \PHPUnit_Framework_TestCase {
|
||||
|
||||
$share = Null;
|
||||
|
||||
if ($result && $result->numRows() > 0) {
|
||||
$share = $result->fetchRow();
|
||||
if ($result) {
|
||||
$share = $result->fetchRow();
|
||||
}
|
||||
|
||||
return $share;
|
||||
|
||||
@@ -4,14 +4,24 @@ OCP\JSON::checkLoggedIn();
|
||||
OCP\JSON::callCheck();
|
||||
|
||||
// "empty trash" command
|
||||
$deleteAll = false;
|
||||
if (isset($_POST['allfiles']) and $_POST['allfiles'] === 'true'){
|
||||
$user = \OCP\User::getUser();
|
||||
$list = OCA\Files_Trashbin\Helper::getTrashFiles('/');
|
||||
$deleteAll = true;
|
||||
$dirlisting = '0';
|
||||
$folder = isset($_POST['dir']) ? $_POST['dir'] : '/';
|
||||
if ($folder === '/' || $folder === '') {
|
||||
OCA\Files_Trashbin\Trashbin::deleteAll();
|
||||
$list = array();
|
||||
} else {
|
||||
$dirname = dirname($folder);
|
||||
if ( $dirname !== '/' && $dirname !== '.' ) {
|
||||
$dirlisting = '1';
|
||||
} else {
|
||||
$dirlisting = '0';
|
||||
}
|
||||
$list[] = $folder;
|
||||
}
|
||||
}
|
||||
else {
|
||||
$deleteAll = false;
|
||||
$files = $_POST['files'];
|
||||
$dirlisting = $_POST['dirlisting'];
|
||||
$list = json_decode($files);
|
||||
@@ -19,19 +29,13 @@ else {
|
||||
$error = array();
|
||||
$success = array();
|
||||
|
||||
|
||||
$i = 0;
|
||||
foreach ($list as $file) {
|
||||
if ( $dirlisting === '0') {
|
||||
if ($deleteAll) {
|
||||
$filename = $file['name'];
|
||||
$timestamp = $file['timestamp'];
|
||||
}
|
||||
else {
|
||||
$delimiter = strrpos($file, '.d');
|
||||
$filename = substr($file, 0, $delimiter);
|
||||
$timestamp = substr($file, $delimiter+2);
|
||||
}
|
||||
$file = ltrim($file, '/');
|
||||
$delimiter = strrpos($file, '.d');
|
||||
$filename = substr($file, 0, $delimiter);
|
||||
$timestamp = substr($file, $delimiter+2);
|
||||
} else {
|
||||
$filename = $file;
|
||||
$timestamp = null;
|
||||
|
||||
@@ -13,6 +13,7 @@ $success = array();
|
||||
$i = 0;
|
||||
foreach ($list as $file) {
|
||||
if ( $dirlisting === '0') {
|
||||
$file = ltrim($file, '/');
|
||||
$delimiter = strrpos($file, '.d');
|
||||
$filename = substr($file, 0, $delimiter);
|
||||
$timestamp = substr($file, $delimiter+2);
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
#fileList td a.file, #fileList td a.file span {
|
||||
cursor: default;
|
||||
}
|
||||
@@ -1,51 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud - trash bin
|
||||
*
|
||||
* @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/>.
|
||||
*
|
||||
*/
|
||||
|
||||
// Check if we are a user
|
||||
OCP\User::checkLoggedIn();
|
||||
|
||||
$filename = $_GET["file"];
|
||||
|
||||
$view = new OC_FilesystemView('/'.\OCP\User::getUser().'/files_trashbin/files');
|
||||
|
||||
if(!$view->file_exists($filename)) {
|
||||
header("HTTP/1.0 404 Not Found");
|
||||
$tmpl = new OCP\Template( '', '404', 'guest' );
|
||||
$tmpl->assign('file', $filename);
|
||||
$tmpl->printPage();
|
||||
exit;
|
||||
}
|
||||
|
||||
$ftype=$view->getMimeType( $filename );
|
||||
|
||||
header('Content-Type:'.$ftype);if ( preg_match( "/MSIE/", $_SERVER["HTTP_USER_AGENT"] ) ) {
|
||||
header( 'Content-Disposition: attachment; filename="' . rawurlencode( basename($filename) ) . '"' );
|
||||
} else {
|
||||
header( 'Content-Disposition: attachment; filename*=UTF-8\'\'' . rawurlencode( basename($filename) )
|
||||
. '; filename="' . rawurlencode( basename($filename) ) . '"' );
|
||||
}
|
||||
OCP\Response::disableCaching();
|
||||
header('Content-Length: '. $view->filesize($filename));
|
||||
|
||||
OC_Util::obEnd();
|
||||
$view->readfile( $filename );
|
||||
@@ -10,6 +10,7 @@ OCP\Util::addScript('files', 'fileactions');
|
||||
$tmpl = new OCP\Template('files_trashbin', 'index', 'user');
|
||||
|
||||
OCP\Util::addStyle('files', 'files');
|
||||
OCP\Util::addStyle('files_trashbin', 'trash');
|
||||
OCP\Util::addScript('files', 'filelist');
|
||||
// filelist overrides
|
||||
OCP\Util::addScript('files_trashbin', 'filelist');
|
||||
|
||||
@@ -3,12 +3,12 @@ $(document).ready(function() {
|
||||
|
||||
if (typeof FileActions !== 'undefined') {
|
||||
FileActions.register('all', 'Restore', OC.PERMISSION_READ, OC.imagePath('core', 'actions/history'), function(filename) {
|
||||
var tr = $('tr').filterAttr('data-file', filename);
|
||||
var deleteAction = $('tr').filterAttr('data-file', filename).children("td.date").children(".action.delete");
|
||||
var tr = FileList.findFileEl(filename);
|
||||
var deleteAction = tr.children("td.date").children(".action.delete");
|
||||
deleteAction.removeClass('delete-icon').addClass('progress-icon');
|
||||
disableActions();
|
||||
$.post(OC.filePath('files_trashbin', 'ajax', 'undelete.php'),
|
||||
{files: JSON.stringify([filename]), dirlisting: tr.attr('data-dirlisting')},
|
||||
{files: JSON.stringify([$('#dir').val() + '/' + filename]), dirlisting: tr.attr('data-dirlisting')},
|
||||
function(result) {
|
||||
for (var i = 0; i < result.data.success.length; i++) {
|
||||
var row = document.getElementById(result.data.success[i].filename);
|
||||
@@ -30,12 +30,12 @@ $(document).ready(function() {
|
||||
return OC.imagePath('core', 'actions/delete');
|
||||
}, function(filename) {
|
||||
$('.tipsy').remove();
|
||||
var tr = $('tr').filterAttr('data-file', filename);
|
||||
var deleteAction = $('tr').filterAttr('data-file', filename).children("td.date").children(".action.delete");
|
||||
var tr = FileList.findFileEl(filename);
|
||||
var deleteAction = tr.children("td.date").children(".action.delete");
|
||||
deleteAction.removeClass('delete-icon').addClass('progress-icon');
|
||||
disableActions();
|
||||
$.post(OC.filePath('files_trashbin', 'ajax', 'delete.php'),
|
||||
{files: JSON.stringify([filename]), dirlisting: tr.attr('data-dirlisting')},
|
||||
{files: JSON.stringify([$('#dir').val() + '/' +filename]), dirlisting: tr.attr('data-dirlisting')},
|
||||
function(result) {
|
||||
for (var i = 0; i < result.data.success.length; i++) {
|
||||
var row = document.getElementById(result.data.success[i].filename);
|
||||
@@ -66,41 +66,6 @@ $(document).ready(function() {
|
||||
procesSelection();
|
||||
});
|
||||
|
||||
$('#fileList').on('click', 'td.filename a', function(event) {
|
||||
if (event.shiftKey) {
|
||||
event.preventDefault();
|
||||
var last = $(lastChecked).parent().parent().prevAll().length;
|
||||
var first = $(this).parent().parent().prevAll().length;
|
||||
var start = Math.min(first, last);
|
||||
var end = Math.max(first, last);
|
||||
var rows = $(this).parent().parent().parent().children('tr');
|
||||
for (var i = start; i < end; i++) {
|
||||
$(rows).each(function(index) {
|
||||
if (index == i) {
|
||||
var checkbox = $(this).children().children('input:checkbox');
|
||||
$(checkbox).attr('checked', 'checked');
|
||||
$(checkbox).parent().parent().addClass('selected');
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
var checkbox = $(this).parent().children('input:checkbox');
|
||||
lastChecked = checkbox;
|
||||
if ($(checkbox).attr('checked')) {
|
||||
$(checkbox).removeAttr('checked');
|
||||
$(checkbox).parent().parent().removeClass('selected');
|
||||
$('#select_all').removeAttr('checked');
|
||||
} else {
|
||||
$(checkbox).attr('checked', 'checked');
|
||||
$(checkbox).parent().parent().toggleClass('selected');
|
||||
var selectedCount = $('td.filename input:checkbox:checked').length;
|
||||
if (selectedCount == $('td.filename input:checkbox').length) {
|
||||
$('#select_all').attr('checked', 'checked');
|
||||
}
|
||||
}
|
||||
procesSelection();
|
||||
});
|
||||
|
||||
$('.undelete').click('click', function(event) {
|
||||
event.preventDefault();
|
||||
var files = getSelectedFiles('file');
|
||||
@@ -108,7 +73,7 @@ $(document).ready(function() {
|
||||
var dirlisting = getSelectedFiles('dirlisting')[0];
|
||||
disableActions();
|
||||
for (var i = 0; i < files.length; i++) {
|
||||
var deleteAction = $('tr').filterAttr('data-file', files[i]).children("td.date").children(".action.delete");
|
||||
var deleteAction = FileList.findFileEl(files[i]).children("td.date").children(".action.delete");
|
||||
deleteAction.removeClass('delete-icon').addClass('progress-icon');
|
||||
}
|
||||
|
||||
@@ -136,7 +101,8 @@ $(document).ready(function() {
|
||||
var params = {};
|
||||
if (allFiles) {
|
||||
params = {
|
||||
allfiles: true
|
||||
allfiles: true,
|
||||
dir: $('#dir').val()
|
||||
};
|
||||
}
|
||||
else {
|
||||
@@ -153,7 +119,7 @@ $(document).ready(function() {
|
||||
}
|
||||
else {
|
||||
for (var i = 0; i < files.length; i++) {
|
||||
var deleteAction = $('tr').filterAttr('data-file', files[i]).children("td.date").children(".action.delete");
|
||||
var deleteAction = FileList.findFileEl(files[i]).children("td.date").children(".action.delete");
|
||||
deleteAction.removeClass('delete-icon').addClass('progress-icon');
|
||||
}
|
||||
}
|
||||
@@ -183,13 +149,27 @@ $(document).ready(function() {
|
||||
|
||||
});
|
||||
|
||||
$('#fileList').on('click', 'td.filename input', function() {
|
||||
var checkbox = $(this).parent().children('input:checkbox');
|
||||
$(checkbox).parent().parent().toggleClass('selected');
|
||||
if ($(checkbox).is(':checked')) {
|
||||
var selectedCount = $('td.filename input:checkbox:checked').length;
|
||||
if (selectedCount === $('td.filename input:checkbox').length) {
|
||||
$('#select_all').prop('checked', true);
|
||||
}
|
||||
} else {
|
||||
$('#select_all').prop('checked',false);
|
||||
}
|
||||
procesSelection();
|
||||
});
|
||||
|
||||
$('#fileList').on('click', 'td.filename a', function(event) {
|
||||
var mime = $(this).parent().parent().data('mime');
|
||||
if (mime !== 'httpd/unix-directory') {
|
||||
event.preventDefault();
|
||||
}
|
||||
var filename = $(this).parent().parent().attr('data-file');
|
||||
var tr = $('tr').filterAttr('data-file',filename);
|
||||
var tr = FileList.findFileEl(filename);
|
||||
var renaming = tr.data('renaming');
|
||||
if(!renaming && !FileList.isLoading(filename)){
|
||||
if(mime.substr(0, 5) === 'text/'){ //no texteditor for now
|
||||
@@ -229,7 +209,7 @@ function getSelectedFiles(property){
|
||||
elements.each(function(i,element){
|
||||
var file={
|
||||
name:$(element).attr('data-filename'),
|
||||
file:$(element).attr('data-file'),
|
||||
file:$('#dir').val() + "/" + $(element).attr('data-file'),
|
||||
timestamp:$(element).attr('data-timestamp'),
|
||||
type:$(element).attr('data-type'),
|
||||
dirlisting:$(element).attr('data-dirlisting')
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
<?php
|
||||
$TRANSLATIONS = array(
|
||||
"Error" => "Ошибка",
|
||||
"Delete" => "Удалить"
|
||||
);
|
||||
$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);";
|
||||
@@ -44,8 +44,10 @@ class Helper
|
||||
}
|
||||
|
||||
$files = array();
|
||||
$id = 0;
|
||||
foreach ($result as $r) {
|
||||
$i = array();
|
||||
$i['id'] = $id++;
|
||||
$i['name'] = $r['id'];
|
||||
$i['date'] = \OCP\Util::formatDate($r['timestamp']);
|
||||
$i['timestamp'] = $r['timestamp'];
|
||||
|
||||
@@ -189,7 +189,7 @@ class Trashbin {
|
||||
if ($rootView->is_dir($owner . '/files_versions/' . $ownerPath)) {
|
||||
$size += self::calculateSize(new \OC\Files\View('/' . $owner . '/files_versions/' . $ownerPath));
|
||||
if ($owner !== $user) {
|
||||
$rootView->copy($owner . '/files_versions/' . $ownerPath, $owner . '/files_trashbin/versions/' . basename($ownerPath) . '.d' . $timestamp);
|
||||
self::copy_recursive($owner . '/files_versions/' . $ownerPath, $owner . '/files_trashbin/versions/' . basename($ownerPath) . '.d' . $timestamp, $rootView);
|
||||
}
|
||||
$rootView->rename($owner . '/files_versions/' . $ownerPath, $user . '/files_trashbin/versions/' . $filename . '.d' . $timestamp);
|
||||
} else if ($versions = \OCA\Files_Versions\Storage::getVersions($owner, $ownerPath)) {
|
||||
@@ -247,7 +247,7 @@ class Trashbin {
|
||||
if ($rootView->is_dir($keyfile)) {
|
||||
$size += self::calculateSize(new \OC\Files\View($keyfile));
|
||||
if ($owner !== $user) {
|
||||
$rootView->copy($keyfile, $owner . '/files_trashbin/keyfiles/' . basename($ownerPath) . '.d' . $timestamp);
|
||||
self::copy_recursive($keyfile, $owner . '/files_trashbin/keyfiles/' . basename($ownerPath) . '.d' . $timestamp, $rootView);
|
||||
}
|
||||
$rootView->rename($keyfile, $user . '/files_trashbin/keyfiles/' . $filename . '.d' . $timestamp);
|
||||
} else {
|
||||
@@ -265,7 +265,7 @@ class Trashbin {
|
||||
if ($rootView->is_dir($sharekeys)) {
|
||||
$size += self::calculateSize(new \OC\Files\View($sharekeys));
|
||||
if ($owner !== $user) {
|
||||
$rootView->copy($sharekeys, $owner . '/files_trashbin/share-keys/' . basename($ownerPath) . '.d' . $timestamp);
|
||||
self::copy_recursive($sharekeys, $owner . '/files_trashbin/share-keys/' . basename($ownerPath) . '.d' . $timestamp, $rootView);
|
||||
}
|
||||
$rootView->rename($sharekeys, $user . '/files_trashbin/share-keys/' . $filename . '.d' . $timestamp);
|
||||
} else {
|
||||
@@ -564,6 +564,21 @@ class Trashbin {
|
||||
return $size;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief delete all files from the trash
|
||||
*/
|
||||
public static function deleteAll() {
|
||||
$user = \OCP\User::getUser();
|
||||
$view = new \OC\Files\View('/' . $user);
|
||||
$view->deleteAll('files_trashbin');
|
||||
self::setTrashbinSize($user, 0);
|
||||
$query = \OC_DB::prepare('DELETE FROM `*PREFIX*files_trash` WHERE `user`=?');
|
||||
$query->execute(array($user));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief delete file from trash bin permanently
|
||||
*
|
||||
@@ -763,8 +778,13 @@ class Trashbin {
|
||||
*/
|
||||
private static function expire($trashbinSize, $user) {
|
||||
|
||||
// let the admin disable auto expire
|
||||
$autoExpire = \OC_Config::getValue('trashbin_auto_expire', true);
|
||||
if ($autoExpire === false) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
$user = \OCP\User::getUser();
|
||||
$view = new \OC\Files\View('/' . $user);
|
||||
$availableSpace = self::calculateFreeSpace($trashbinSize);
|
||||
$size = 0;
|
||||
|
||||
|
||||
@@ -3,11 +3,11 @@
|
||||
<img src="<?php print_unescaped(OCP\image_path('core', 'places/home.svg'));?>" class="svg" />
|
||||
</a>
|
||||
</div>
|
||||
<?php if(count($_["breadcrumb"])):?>
|
||||
<div class="crumb svg"
|
||||
data-dir='/'>
|
||||
<div class="crumb svg"
|
||||
data-dir='/'>
|
||||
<a href="<?php p($_['baseURL']); ?>"><?php p($l->t("Deleted Files")); ?></a>
|
||||
</div>
|
||||
</div>
|
||||
<?php if(count($_["breadcrumb"])):?>
|
||||
<?php endif;?>
|
||||
<?php for($i=0; $i<count($_["breadcrumb"]); $i++):
|
||||
$crumb = $_["breadcrumb"][$i];
|
||||
|
||||
@@ -35,18 +35,21 @@
|
||||
<?php endif; ?>
|
||||
<?php endif; ?>
|
||||
>
|
||||
<?php if(!isset($_['readonly']) || !$_['readonly']): ?><input type="checkbox" /><?php endif; ?>
|
||||
<?php if(!isset($_['readonly']) || !$_['readonly']): ?>
|
||||
<input id="select-<?php p($file['id']); ?>" type="checkbox" />
|
||||
<label for="select-<?php p($file['id']); ?>"></label>
|
||||
<?php endif; ?>
|
||||
<?php if($file['type'] === 'dir'): ?>
|
||||
<?php if( $_['dirlisting'] ): ?>
|
||||
<a class="name" href="<?php p($_['baseURL'].'/'.$name); ?>" title="">
|
||||
<a class="name dir" href="<?php p($_['baseURL'].'/'.$name); ?>" title="">
|
||||
<?php else: ?>
|
||||
<a class="name" href="<?php p($_['baseURL'].'/'.$name.'.d'.$file['timestamp']); ?>" title="">
|
||||
<a class="name dir" href="<?php p($_['baseURL'].'/'.$name.'.d'.$file['timestamp']); ?>" title="">
|
||||
<?php endif; ?>
|
||||
<?php else: ?>
|
||||
<?php if( $_['dirlisting'] ): ?>
|
||||
<a class="name" href="<?php p($_['downloadURL'].'/'.$name); ?>" title="">
|
||||
<a class="name file" href="<?php p($_['downloadURL'].'/'.$name); ?>" title="">
|
||||
<?php else: ?>
|
||||
<a class="name" href="<?php p($_['downloadURL'].'/'.$name.'.d'.$file['timestamp']);?>" title="">
|
||||
<a class="name file" href="<?php p($_['downloadURL'].'/'.$name.'.d'.$file['timestamp']);?>" title="">
|
||||
<?php endif; ?>
|
||||
<?php endif; ?>
|
||||
<span class="nametext">
|
||||
|
||||
@@ -36,12 +36,7 @@ $view = new OC\Files\View('/');
|
||||
$ftype = $view->getMimeType('/'.$uid.'/files/'.$filename);
|
||||
|
||||
header('Content-Type:'.$ftype);
|
||||
if ( preg_match( "/MSIE/", $_SERVER["HTTP_USER_AGENT"] ) ) {
|
||||
header( 'Content-Disposition: attachment; filename="' . rawurlencode( basename($filename) ) . '"' );
|
||||
} else {
|
||||
header( 'Content-Disposition: attachment; filename*=UTF-8\'\'' . rawurlencode( basename($filename) )
|
||||
. '; filename="' . rawurlencode( basename($filename) ) . '"' );
|
||||
}
|
||||
OCP\Response::setContentDispositionHeader(basename($filename), 'attachment');
|
||||
OCP\Response::disableCaching();
|
||||
header('Content-Length: '.$view->filesize($versionName));
|
||||
|
||||
|
||||
@@ -77,6 +77,7 @@ function goToVersionPage(url){
|
||||
function createVersionsDropdown(filename, files) {
|
||||
|
||||
var start = 0;
|
||||
var fileEl;
|
||||
|
||||
var html = '<div id="dropdown" class="drop drop-versions" data-file="'+escapeHTML(files)+'">';
|
||||
html += '<div id="private">';
|
||||
@@ -86,8 +87,9 @@ function createVersionsDropdown(filename, files) {
|
||||
html += '<input type="button" value="'+ t('files_versions', 'More versions...') + '" name="show-more-versions" id="show-more-versions" style="display: none;" />';
|
||||
|
||||
if (filename) {
|
||||
$('tr').filterAttr('data-file',filename).addClass('mouseOver');
|
||||
$(html).appendTo($('tr').filterAttr('data-file',filename).find('td.filename'));
|
||||
fileEl = FileList.findFileEl(filename);
|
||||
fileEl.addClass('mouseOver');
|
||||
$(html).appendTo(fileEl.find('td.filename'));
|
||||
} else {
|
||||
$(html).appendTo($('thead .share'));
|
||||
}
|
||||
@@ -138,7 +140,7 @@ function createVersionsDropdown(filename, files) {
|
||||
|
||||
var preview = '<img class="preview" src="'+revision.preview+'"/>';
|
||||
|
||||
var download ='<a href="' + path + "?file=" + files + '&revision=' + revision.version + '">';
|
||||
var download ='<a href="' + path + "?file=" + encodeURIComponent(files) + '&revision=' + revision.version + '">';
|
||||
download+='<img';
|
||||
download+=' src="' + OC.imagePath('core', 'actions/download') + '"';
|
||||
download+=' name="downloadVersion" />';
|
||||
@@ -146,8 +148,7 @@ function createVersionsDropdown(filename, files) {
|
||||
download+='</a>';
|
||||
|
||||
var revert='<span class="revertVersion"';
|
||||
revert+=' id="' + revision.version + '"';
|
||||
revert+=' value="' + files + '">';
|
||||
revert+=' id="' + revision.version + '">';
|
||||
revert+='<img';
|
||||
revert+=' src="' + OC.imagePath('core', 'actions/history') + '"';
|
||||
revert+=' name="revertVersion"';
|
||||
@@ -156,14 +157,13 @@ function createVersionsDropdown(filename, files) {
|
||||
var version=$('<li/>');
|
||||
version.attr('value', revision.version);
|
||||
version.html(preview + download + revert);
|
||||
// add file here for proper name escaping
|
||||
version.find('span.revertVersion').attr('value', files);
|
||||
|
||||
version.appendTo('#found_versions');
|
||||
}
|
||||
|
||||
$('tr').filterAttr('data-file',filename).addClass('mouseOver');
|
||||
$('#dropdown').show('blind');
|
||||
|
||||
|
||||
}
|
||||
|
||||
$(this).click(
|
||||
|
||||
@@ -98,7 +98,6 @@ class Storage {
|
||||
|
||||
$files_view = new \OC\Files\View('/'.$uid .'/files');
|
||||
$users_view = new \OC\Files\View('/'.$uid);
|
||||
$versions_view = new \OC\Files\View('/'.$uid.'/files_versions');
|
||||
|
||||
// check if filename is a directory
|
||||
if($files_view->is_dir($filename)) {
|
||||
@@ -132,7 +131,10 @@ class Storage {
|
||||
\OC_FileProxy::$enabled = false;
|
||||
|
||||
// store a new version of a file
|
||||
$users_view->copy('files'.$filename, 'files_versions'.$filename.'.v'.$users_view->filemtime('files'.$filename));
|
||||
$mtime = $users_view->filemtime('files'.$filename);
|
||||
$users_view->copy('files'.$filename, 'files_versions'.$filename.'.v'. $mtime);
|
||||
// call getFileInfo to enforce a file cache entry for the new version
|
||||
$users_view->getFileInfo('files_versions'.$filename.'.v'.$mtime);
|
||||
|
||||
// reset proxy state
|
||||
\OC_FileProxy::$enabled = $proxyStatus;
|
||||
|
||||
@@ -27,6 +27,18 @@ OCP\JSON::checkAppEnabled('user_ldap');
|
||||
OCP\JSON::callCheck();
|
||||
|
||||
$prefix = $_POST['ldap_serverconfig_chooser'];
|
||||
|
||||
// Checkboxes are not submitted, when they are unchecked. Set them manually.
|
||||
// only legacy checkboxes (Advanced and Expert tab) need to be handled here,
|
||||
// the Wizard-like tabs handle it on their own
|
||||
$chkboxes = array('ldap_configuration_active', 'ldap_override_main_server',
|
||||
'ldap_nocase', 'ldap_turn_off_cert_check');
|
||||
foreach($chkboxes as $boxid) {
|
||||
if(!isset($_POST[$boxid])) {
|
||||
$_POST[$boxid] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
$ldapWrapper = new OCA\user_ldap\lib\LDAP();
|
||||
$connection = new \OCA\user_ldap\lib\Connection($ldapWrapper, $prefix);
|
||||
$connection->setConfiguration($_POST);
|
||||
|
||||
@@ -30,6 +30,8 @@ $l=OC_L10N::get('user_ldap');
|
||||
|
||||
$ldapWrapper = new OCA\user_ldap\lib\LDAP();
|
||||
$connection = new \OCA\user_ldap\lib\Connection($ldapWrapper, '', null);
|
||||
//needs to be true, otherwise it will also fail with an irritating message
|
||||
$_POST['ldap_configuration_active'] = 1;
|
||||
if($connection->setConfiguration($_POST)) {
|
||||
//Configuration is okay
|
||||
if($connection->bind()) {
|
||||
|
||||
@@ -407,6 +407,7 @@ var LdapWizard = {
|
||||
if($('#rawLoginFilterContainer').hasClass('invisible')) {
|
||||
$('#ldap_loginfilter_attributes').multiselect('enable');
|
||||
}
|
||||
LdapWizard.postInitLoginFilter();
|
||||
},
|
||||
function (result) {
|
||||
//deactivate if no attributes found
|
||||
@@ -443,10 +444,24 @@ var LdapWizard = {
|
||||
//enable only when raw filter editing is not turned on
|
||||
$('#'+multisel).multiselect('enable');
|
||||
}
|
||||
if(type === 'Users') {
|
||||
//required for initial save
|
||||
filter = $('#ldap_userlist_filter').val();
|
||||
if(!filter) {
|
||||
LdapWizard.saveMultiSelect(multisel,
|
||||
$('#'+multisel).multiselect("getChecked"));
|
||||
}
|
||||
LdapWizard.userFilterAvailableGroupsHasRun = true;
|
||||
LdapWizard.postInitUserFilter();
|
||||
}
|
||||
},
|
||||
function (result) {
|
||||
LdapWizard.hideSpinner('#'+multisel);
|
||||
$('#'+multisel).multiselect('disable');
|
||||
if(type == 'Users') {
|
||||
LdapWizard.userFilterAvailableGroupsHasRun = true;
|
||||
LdapWizard.postInitUserFilter();
|
||||
}
|
||||
}
|
||||
);
|
||||
},
|
||||
@@ -471,9 +486,23 @@ var LdapWizard = {
|
||||
LdapWizard.hideSpinner('#'+multisel);
|
||||
LdapWizard.applyChanges(result);
|
||||
$('#'+multisel).multiselect('refresh');
|
||||
if(type === 'User') {
|
||||
//required for initial save
|
||||
filter = $('#ldap_userlist_filter').val();
|
||||
if(!filter) {
|
||||
LdapWizard.saveMultiSelect(multisel,
|
||||
$('#'+multisel).multiselect("getChecked"));
|
||||
}
|
||||
LdapWizard.userFilterObjectClassesHasRun = true;
|
||||
LdapWizard.postInitUserFilter();
|
||||
}
|
||||
},
|
||||
function (result) {
|
||||
LdapWizard.hideSpinner('#'+multisel);
|
||||
if(type == 'User') {
|
||||
LdapWizard.userFilterObjectClassesHasRun = true;
|
||||
LdapWizard.postInitUserFilter();
|
||||
}
|
||||
//TODO: error handling
|
||||
}
|
||||
);
|
||||
@@ -489,13 +518,17 @@ var LdapWizard = {
|
||||
loginfilter = $('#ldap_login_filter').val();
|
||||
|
||||
//FIXME: activates a manually deactivated configuration.
|
||||
if(host && port && base && userfilter && loginfilter) {
|
||||
if(host && port && base && userfilter && loginfilter) {
|
||||
LdapWizard.updateStatusIndicator(true);
|
||||
if($('#ldap_configuration_active').is(':checked')) {
|
||||
return;
|
||||
}
|
||||
$('#ldap_configuration_active').prop('checked', true);
|
||||
LdapWizard.save($('#ldap_configuration_active')[0]);
|
||||
if(!LdapWizard.isConfigurationActiveControlLocked) {
|
||||
//avoids a manually deactivated connection will be activated
|
||||
//upon opening the admin page
|
||||
$('#ldap_configuration_active').prop('checked', true);
|
||||
LdapWizard.save($('#ldap_configuration_active')[0]);
|
||||
}
|
||||
} else {
|
||||
if($('#ldap_configuration_active').is(':checked')) {
|
||||
$('#ldap_configuration_active').prop('checked', false);
|
||||
@@ -517,9 +550,12 @@ var LdapWizard = {
|
||||
$(id + " + button").css('display', 'inline');
|
||||
},
|
||||
|
||||
isConfigurationActiveControlLocked: true,
|
||||
|
||||
init: function() {
|
||||
LdapWizard.basicStatusCheck();
|
||||
LdapWizard.functionalityCheck();
|
||||
LdapWizard.isConfigurationActiveControlLocked = false;
|
||||
},
|
||||
|
||||
initGroupFilter: function() {
|
||||
@@ -529,11 +565,21 @@ var LdapWizard = {
|
||||
LdapWizard.countGroups();
|
||||
},
|
||||
|
||||
/** init login filter tab section **/
|
||||
|
||||
initLoginFilter: function() {
|
||||
LdapWizard.regardFilterMode('Login');
|
||||
LdapWizard.findAttributes();
|
||||
},
|
||||
|
||||
postInitLoginFilter: function() {
|
||||
if($('#rawLoginFilterContainer').hasClass('invisible')) {
|
||||
LdapWizard.composeFilter('login');
|
||||
}
|
||||
},
|
||||
|
||||
/** end of init user filter tab section **/
|
||||
|
||||
initMultiSelect: function(object, id, caption) {
|
||||
object.multiselect({
|
||||
header: false,
|
||||
@@ -546,13 +592,29 @@ var LdapWizard = {
|
||||
});
|
||||
},
|
||||
|
||||
/** init user filter tab section **/
|
||||
|
||||
userFilterObjectClassesHasRun: false,
|
||||
userFilterAvailableGroupsHasRun: false,
|
||||
|
||||
initUserFilter: function() {
|
||||
LdapWizard.userFilterObjectClassesHasRun = false;
|
||||
LdapWizard.userFilterAvailableGroupsHasRun = false;
|
||||
LdapWizard.regardFilterMode('User');
|
||||
LdapWizard.findObjectClasses('ldap_userfilter_objectclass', 'User');
|
||||
LdapWizard.findAvailableGroups('ldap_userfilter_groups', 'Users');
|
||||
LdapWizard.countUsers();
|
||||
},
|
||||
|
||||
postInitUserFilter: function() {
|
||||
if(LdapWizard.userFilterObjectClassesHasRun
|
||||
&& LdapWizard.userFilterAvailableGroupsHasRun) {
|
||||
LdapWizard.composeFilter('user');
|
||||
LdapWizard.countUsers();
|
||||
}
|
||||
},
|
||||
|
||||
/** end of init user filter tab section **/
|
||||
|
||||
onTabChange: function(event, ui) {
|
||||
newTabIndex = 0;
|
||||
if(ui.newTab[0].id === '#ldapWizard2') {
|
||||
@@ -619,8 +681,6 @@ var LdapWizard = {
|
||||
} else if(mode == LdapWizard.filterModeAssisted
|
||||
&& !$('#raw'+subject+'FilterContainer').hasClass('invisible')) {
|
||||
LdapWizard['toggleRaw'+subject+'Filter']();
|
||||
} else {
|
||||
c = $('#raw'+subject+'FilterContainer').hasClass('invisible');
|
||||
}
|
||||
},
|
||||
function (result) {
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
<?php
|
||||
$TRANSLATIONS = array(
|
||||
"Error" => "Ошибка",
|
||||
"Select groups" => "Выбрать группы",
|
||||
"_%s group found_::_%s groups found_" => array("","",""),
|
||||
"_%s user found_::_%s users found_" => array("","",""),
|
||||
"Save" => "Сохранить",
|
||||
"Help" => "Помощь",
|
||||
"Password" => "Пароль",
|
||||
"Back" => "Назад"
|
||||
);
|
||||
$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);";
|
||||
+118
-27
@@ -634,6 +634,10 @@ class Access extends LDAPUtility {
|
||||
return $this->search($filter, $this->connection->ldapBaseUsers, $attr, $limit, $offset);
|
||||
}
|
||||
|
||||
public function countUsers($filter, $attr = array('dn'), $limit = null, $offset = null) {
|
||||
return $this->count($filter, $this->connection->ldapBaseGroups, $attr, $limit, $offset);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief executes an LDAP search, optimized for Groups
|
||||
* @param $filter the LDAP filter for the search
|
||||
@@ -647,61 +651,68 @@ class Access extends LDAPUtility {
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief executes an LDAP search
|
||||
* @brief prepares and executes an LDAP search operation
|
||||
* @param $filter the LDAP filter for the search
|
||||
* @param $base an array containing the LDAP subtree(s) that shall be searched
|
||||
* @param $attr optional, array, one or more attributes that shall be
|
||||
* retrieved. Results will according to the order in the array.
|
||||
* @returns array with the search result
|
||||
*
|
||||
* Executes an LDAP search
|
||||
* @param $limit optional, maximum results to be counted
|
||||
* @param $offset optional, a starting point
|
||||
* @returns array with the search result as first value and pagedSearchOK as
|
||||
* second | false if not successful
|
||||
*/
|
||||
private function search($filter, $base, $attr = null, $limit = null, $offset = null, $skipHandling = false) {
|
||||
private function executeSearch($filter, $base, &$attr = null, $limit = null, $offset = null) {
|
||||
if(!is_null($attr) && !is_array($attr)) {
|
||||
$attr = array(mb_strtolower($attr, 'UTF-8'));
|
||||
}
|
||||
|
||||
// See if we have a resource, in case not cancel with message
|
||||
$link_resource = $this->connection->getConnectionResource();
|
||||
if(!$this->ldap->isResource($link_resource)) {
|
||||
$cr = $this->connection->getConnectionResource();
|
||||
if(!$this->ldap->isResource($cr)) {
|
||||
// Seems like we didn't find any resource.
|
||||
// Return an empty array just like before.
|
||||
\OCP\Util::writeLog('user_ldap', 'Could not search, because resource is missing.', \OCP\Util::DEBUG);
|
||||
return array();
|
||||
return false;
|
||||
}
|
||||
|
||||
//check wether paged search should be attempted
|
||||
$pagedSearchOK = $this->initPagedSearch($filter, $base, $attr, $limit, $offset);
|
||||
|
||||
$linkResources = array_pad(array(), count($base), $link_resource);
|
||||
$linkResources = array_pad(array(), count($base), $cr);
|
||||
$sr = $this->ldap->search($linkResources, $base, $filter, $attr);
|
||||
$error = $this->ldap->errno($link_resource);
|
||||
$error = $this->ldap->errno($cr);
|
||||
if(!is_array($sr) || $error !== 0) {
|
||||
\OCP\Util::writeLog('user_ldap',
|
||||
'Error when searching: '.$this->ldap->error($link_resource).
|
||||
' code '.$this->ldap->errno($link_resource),
|
||||
'Error when searching: '.$this->ldap->error($cr).
|
||||
' code '.$this->ldap->errno($cr),
|
||||
\OCP\Util::ERROR);
|
||||
\OCP\Util::writeLog('user_ldap', 'Attempt for Paging? '.print_r($pagedSearchOK, true), \OCP\Util::ERROR);
|
||||
return array();
|
||||
return false;
|
||||
}
|
||||
|
||||
// Do the server-side sorting
|
||||
foreach(array_reverse($attr) as $sortAttr){
|
||||
foreach($sr as $searchResource) {
|
||||
$this->ldap->sort($link_resource, $searchResource, $sortAttr);
|
||||
}
|
||||
}
|
||||
return array($sr, $pagedSearchOK);
|
||||
}
|
||||
|
||||
$findings = array();
|
||||
foreach($sr as $key => $res) {
|
||||
$findings = array_merge($findings, $this->ldap->getEntries($link_resource, $res ));
|
||||
}
|
||||
/**
|
||||
* @brief processes an LDAP paged search operation
|
||||
* @param $sr the array containing the LDAP search resources
|
||||
* @param $filter the LDAP filter for the search
|
||||
* @param $base an array containing the LDAP subtree(s) that shall be searched
|
||||
* @param $iFoundItems number of results in the search operation
|
||||
* @param $limit maximum results to be counted
|
||||
* @param $offset a starting point
|
||||
* @param $pagedSearchOK whether a paged search has been executed
|
||||
* @param $skipHandling required for paged search when cookies to
|
||||
* prior results need to be gained
|
||||
* @returns array with the search result as first value and pagedSearchOK as
|
||||
* second | false if not successful
|
||||
*/
|
||||
private function processPagedSearchStatus($sr, $filter, $base, $iFoundItems, $limit, $offset, $pagedSearchOK, $skipHandling) {
|
||||
if($pagedSearchOK) {
|
||||
\OCP\Util::writeLog('user_ldap', 'Paged search successful', \OCP\Util::INFO);
|
||||
$cr = $this->connection->getConnectionResource();
|
||||
foreach($sr as $key => $res) {
|
||||
$cookie = null;
|
||||
if($this->ldap->controlPagedResultResponse($link_resource, $res, $cookie)) {
|
||||
\OCP\Util::writeLog('user_ldap', 'Set paged search cookie', \OCP\Util::INFO);
|
||||
if($this->ldap->controlPagedResultResponse($cr, $res, $cookie)) {
|
||||
$this->setPagedResultCookie($base[$key], $filter, $limit, $offset, $cookie);
|
||||
}
|
||||
}
|
||||
@@ -713,7 +724,7 @@ class Access extends LDAPUtility {
|
||||
// if count is bigger, then the server does not support
|
||||
// paged search. Instead, he did a normal search. We set a
|
||||
// flag here, so the callee knows how to deal with it.
|
||||
if($findings['count'] <= $limit) {
|
||||
if($iFoundItems <= $limit) {
|
||||
$this->pagedSearchedSuccessful = true;
|
||||
}
|
||||
} else {
|
||||
@@ -721,6 +732,86 @@ class Access extends LDAPUtility {
|
||||
\OCP\Util::writeLog('user_ldap', 'Paged search failed :(', \OCP\Util::INFO);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief executes an LDAP search, but counts the results only
|
||||
* @param $filter the LDAP filter for the search
|
||||
* @param $base an array containing the LDAP subtree(s) that shall be searched
|
||||
* @param $attr optional, array, one or more attributes that shall be
|
||||
* retrieved. Results will according to the order in the array.
|
||||
* @param $limit optional, maximum results to be counted
|
||||
* @param $offset optional, a starting point
|
||||
* @param $skipHandling indicates whether the pages search operation is
|
||||
* completed
|
||||
* @returns int | false if the search could not be initialized
|
||||
*
|
||||
*/
|
||||
private function count($filter, $base, $attr = null, $limit = null, $offset = null, $skipHandling = false) {
|
||||
\OCP\Util::writeLog('user_ldap', 'Count filter: '.print_r($filter, true), \OCP\Util::DEBUG);
|
||||
$search = $this->executeSearch($filter, $base, $attr, $limit, $offset);
|
||||
if($search === false) {
|
||||
return false;
|
||||
}
|
||||
list($sr, $pagedSearchOK) = $search;
|
||||
$cr = $this->connection->getConnectionResource();
|
||||
$counter = 0;
|
||||
foreach($sr as $key => $res) {
|
||||
$count = $this->ldap->countEntries($cr, $res);
|
||||
if($count !== false) {
|
||||
$counter += $count;
|
||||
}
|
||||
}
|
||||
|
||||
$this->processPagedSearchStatus($sr, $filter, $base, $counter, $limit,
|
||||
$offset, $pagedSearchOK, $skipHandling);
|
||||
|
||||
return $counter;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief executes an LDAP search
|
||||
* @param $filter the LDAP filter for the search
|
||||
* @param $base an array containing the LDAP subtree(s) that shall be searched
|
||||
* @param $attr optional, array, one or more attributes that shall be
|
||||
* retrieved. Results will according to the order in the array.
|
||||
* @returns array with the search result
|
||||
*
|
||||
* Executes an LDAP search
|
||||
*/
|
||||
private function search($filter, $base, $attr = null, $limit = null, $offset = null, $skipHandling = false) {
|
||||
$search = $this->executeSearch($filter, $base, $attr, $limit, $offset);
|
||||
if($search === false) {
|
||||
return array();
|
||||
}
|
||||
list($sr, $pagedSearchOK) = $search;
|
||||
$cr = $this->connection->getConnectionResource();
|
||||
|
||||
if($skipHandling) {
|
||||
//i.e. result do not need to be fetched, we just need the cookie
|
||||
//thus pass 1 or any other value as $iFoundItems because it is not
|
||||
//used
|
||||
$this->processPagedSearchStatus($sr, $filter, $base, 1, $limit,
|
||||
$offset, $pagedSearchOK,
|
||||
$skipHandling);
|
||||
return;
|
||||
}
|
||||
|
||||
// Do the server-side sorting
|
||||
foreach(array_reverse($attr) as $sortAttr){
|
||||
foreach($sr as $searchResource) {
|
||||
$this->ldap->sort($cr, $searchResource, $sortAttr);
|
||||
}
|
||||
}
|
||||
|
||||
$findings = array();
|
||||
foreach($sr as $key => $res) {
|
||||
$findings = array_merge($findings, $this->ldap->getEntries($cr , $res ));
|
||||
}
|
||||
|
||||
$this->processPagedSearchStatus($sr, $filter, $base, $findings['count'],
|
||||
$limit, $offset, $pagedSearchOK,
|
||||
$skipHandling);
|
||||
|
||||
// if we're here, probably no connection resource is returned.
|
||||
// to make ownCloud behave nicely, we simply give back an empty array.
|
||||
|
||||
@@ -129,6 +129,7 @@ class Configuration {
|
||||
if(!empty($val) && strpos($val, 'attr:') === false) {
|
||||
$val = 'attr:'.$val;
|
||||
}
|
||||
break;
|
||||
case 'ldapBase':
|
||||
case 'ldapBaseUsers':
|
||||
case 'ldapBaseGroups':
|
||||
@@ -140,11 +141,11 @@ class Configuration {
|
||||
case 'ldapGroupFilterGroups':
|
||||
case 'ldapLoginFilterAttributes':
|
||||
$setMethod = 'setMultiLine';
|
||||
default:
|
||||
$this->$setMethod($key, $val);
|
||||
if(is_array($applied)) {
|
||||
$applied[] = $inputkey;
|
||||
}
|
||||
break;
|
||||
}
|
||||
$this->$setMethod($key, $val);
|
||||
if(is_array($applied)) {
|
||||
$applied[] = $inputkey;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -308,7 +309,7 @@ class Configuration {
|
||||
'ldap_user_filter_mode' => 0,
|
||||
'ldap_userfilter_objectclass' => '',
|
||||
'ldap_userfilter_groups' => '',
|
||||
'ldap_login_filter' => 'uid=%uid',
|
||||
'ldap_login_filter' => '',
|
||||
'ldap_login_filter_mode' => 0,
|
||||
'ldap_loginfilter_email' => 0,
|
||||
'ldap_loginfilter_username' => 1,
|
||||
|
||||
@@ -50,7 +50,8 @@ class Connection extends LDAPUtility {
|
||||
parent::__construct($ldap);
|
||||
$this->configPrefix = $configPrefix;
|
||||
$this->configID = $configID;
|
||||
$this->configuration = new Configuration($configPrefix);
|
||||
$this->configuration = new Configuration($configPrefix,
|
||||
!is_null($configID));
|
||||
$memcache = new \OC\Memcache\Factory();
|
||||
if($memcache->isAvailable()) {
|
||||
$this->cache = $memcache->create();
|
||||
|
||||
@@ -91,7 +91,7 @@ class LDAP implements ILDAPWrapper {
|
||||
}
|
||||
|
||||
public function setOption($link, $option, $value) {
|
||||
$this->invokeLDAPMethod('set_option', $link, $option, $value);
|
||||
return $this->invokeLDAPMethod('set_option', $link, $option, $value);
|
||||
}
|
||||
|
||||
public function sort($link, $result, $sortfilter) {
|
||||
|
||||
@@ -432,7 +432,6 @@ class Wizard extends LDAPUtility {
|
||||
$this->configuration->setConfiguration($config);
|
||||
\OCP\Util::writeLog('user_ldap', 'Wiz: detected Port '. $p, \OCP\Util::DEBUG);
|
||||
$this->result->addChange('ldap_port', $p);
|
||||
$this->result->addChange('ldap_tls', intval($t));
|
||||
return $this->result;
|
||||
}
|
||||
}
|
||||
@@ -793,10 +792,13 @@ class Wizard extends LDAPUtility {
|
||||
|
||||
\OCP\Util::writeLog('user_ldap', 'Wiz: Setting LDAP Options ', \OCP\Util::DEBUG);
|
||||
//set LDAP options
|
||||
$a = $this->ldap->setOption($cr, LDAP_OPT_PROTOCOL_VERSION, 3);
|
||||
$c = $this->ldap->setOption($cr, LDAP_OPT_NETWORK_TIMEOUT, self::LDAP_NW_TIMEOUT);
|
||||
$this->ldap->setOption($cr, LDAP_OPT_PROTOCOL_VERSION, 3);
|
||||
$this->ldap->setOption($cr, LDAP_OPT_NETWORK_TIMEOUT, self::LDAP_NW_TIMEOUT);
|
||||
if($tls) {
|
||||
$this->ldap->startTls($cr);
|
||||
$isTlsWorking = @$this->ldap->startTls($cr);
|
||||
if(!$isTlsWorking) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
\OCP\Util::writeLog('user_ldap', 'Wiz: Attemping to Bind ', \OCP\Util::DEBUG);
|
||||
@@ -810,7 +812,7 @@ class Wizard extends LDAPUtility {
|
||||
if($ncc) {
|
||||
throw new \Exception('Certificate cannot be validated.');
|
||||
}
|
||||
\OCP\Util::writeLog('user_ldap', 'Wiz: Bind succesfull with Port '. $port, \OCP\Util::DEBUG);
|
||||
\OCP\Util::writeLog('user_ldap', 'Wiz: Bind successfull to Port '. $port . ' TLS ' . intval($tls), \OCP\Util::DEBUG);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -1001,7 +1003,7 @@ class Wizard extends LDAPUtility {
|
||||
|
||||
private function getConnection() {
|
||||
if(!is_null($this->cr)) {
|
||||
return $cr;
|
||||
return $this->cr;
|
||||
}
|
||||
$cr = $this->ldap->connect(
|
||||
$this->configuration->ldapHost.':'.$this->configuration->ldapPort,
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<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"
|
||||
<a href="<?php print_unescaped(link_to_docs('admin-ldap')); ?>"
|
||||
target="_blank">
|
||||
<img src="<?php print_unescaped(OCP\Util::imagePath('', 'actions/info.png')); ?>"
|
||||
style="height:1.75ex" />
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
<div class="tablerow">
|
||||
<input type="text" id="ldap_dn" name="ldap_dn"
|
||||
class="tablecell lwautosave"
|
||||
placeholder="<?php p($l->t('User DN'));?>"
|
||||
placeholder="<?php p($l->t('User DN'));?>" autocomplete="off"
|
||||
title="<?php p($l->t('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.'));?>"
|
||||
/>
|
||||
</div>
|
||||
@@ -49,7 +49,7 @@
|
||||
<div class="tablerow">
|
||||
<input type="password" id="ldap_agent_password"
|
||||
class="tablecell lwautosave" name="ldap_agent_password"
|
||||
placeholder="<?php p($l->t('Password'));?>"
|
||||
placeholder="<?php p($l->t('Password'));?>" autocomplete="off"
|
||||
title="<?php p($l->t('For anonymous access, leave DN and Password empty.'));?>"
|
||||
/>
|
||||
</div>
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
<button class="ldap_action_continue" name="ldap_action_continue" type="button">
|
||||
<?php p($l->t('Continue'));?>
|
||||
</button>
|
||||
<a href="<?php p($theme->getDocBaseUrl()); ?>/server/5.0/admin_manual/auth_ldap.html"
|
||||
<a href="<?php print_unescaped(link_to_docs('admin-ldap')); ?>"
|
||||
target="_blank">
|
||||
<img src="<?php print_unescaped(OCP\Util::imagePath('', 'actions/info.png')); ?>"
|
||||
style="height:1.75ex" />
|
||||
|
||||
@@ -408,4 +408,58 @@ class Test_User_Ldap_Direct extends \PHPUnit_Framework_TestCase {
|
||||
|
||||
//no test for getDisplayNames, because it just invokes getUsers and
|
||||
//getDisplayName
|
||||
|
||||
public function testCountUsers() {
|
||||
$access = $this->getAccessMock();
|
||||
|
||||
$access->connection->expects($this->once())
|
||||
->method('__get')
|
||||
->will($this->returnCallback(function($name) {
|
||||
if($name === 'ldapLoginFilter') {
|
||||
return 'uid=%uid';
|
||||
}
|
||||
return null;
|
||||
}));
|
||||
|
||||
$access->expects($this->once())
|
||||
->method('countUsers')
|
||||
->will($this->returnCallback(function($filter, $a, $b, $c) {
|
||||
if($filter !== 'uid=*') {
|
||||
return false;
|
||||
}
|
||||
return 5;
|
||||
}));
|
||||
|
||||
$backend = new UserLDAP($access);
|
||||
|
||||
$result = $backend->countUsers();
|
||||
$this->assertEquals(5, $result);
|
||||
}
|
||||
|
||||
public function testCountUsersFailing() {
|
||||
$access = $this->getAccessMock();
|
||||
|
||||
$access->connection->expects($this->once())
|
||||
->method('__get')
|
||||
->will($this->returnCallback(function($name) {
|
||||
if($name === 'ldapLoginFilter') {
|
||||
return 'invalidFilter';
|
||||
}
|
||||
return null;
|
||||
}));
|
||||
|
||||
$access->expects($this->once())
|
||||
->method('countUsers')
|
||||
->will($this->returnCallback(function($filter, $a, $b, $c) {
|
||||
if($filter !== 'uid=*') {
|
||||
return false;
|
||||
}
|
||||
return 5;
|
||||
}));
|
||||
|
||||
$backend = new UserLDAP($access);
|
||||
|
||||
$result = $backend->countUsers();
|
||||
$this->assertFalse($result);
|
||||
}
|
||||
}
|
||||
@@ -363,7 +363,8 @@ class USER_LDAP extends BackendUtility implements \OCP\UserInterface {
|
||||
return (bool)((OC_USER_BACKEND_CHECK_PASSWORD
|
||||
| OC_USER_BACKEND_GET_HOME
|
||||
| OC_USER_BACKEND_GET_DISPLAYNAME
|
||||
| OC_USER_BACKEND_PROVIDE_AVATAR)
|
||||
| OC_USER_BACKEND_PROVIDE_AVATAR
|
||||
| OC_USER_BACKEND_COUNT_USERS)
|
||||
& $actions);
|
||||
}
|
||||
|
||||
@@ -373,4 +374,16 @@ class USER_LDAP extends BackendUtility implements \OCP\UserInterface {
|
||||
public function hasUserListings() {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* counts the users in LDAP
|
||||
*
|
||||
* @return int | bool
|
||||
*/
|
||||
public function countUsers() {
|
||||
$filter = \OCP\Util::mb_str_replace(
|
||||
'%uid', '*', $this->access->connection->ldapLoginFilter, 'UTF-8');
|
||||
$entries = $this->access->countUsers($filter);
|
||||
return $entries;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -210,4 +210,19 @@ class User_Proxy extends lib\Proxy implements \OCP\UserInterface {
|
||||
return $this->refBackend->hasUserListings();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Count the number of users
|
||||
* @returns int | bool
|
||||
*/
|
||||
public function countUsers() {
|
||||
$users = false;
|
||||
foreach($this->backends as $backend) {
|
||||
$backendUsers = $backend->countUsers();
|
||||
if ($backendUsers !== false) {
|
||||
$users += $backendUsers;
|
||||
}
|
||||
}
|
||||
return $users;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Regular → Executable
+8
-2
@@ -114,9 +114,15 @@ $CONFIG = array(
|
||||
/* Password to use for sendmail mail, depends on mail_smtpauth if this is used */
|
||||
"mail_smtppassword" => "",
|
||||
|
||||
/* memcached hostname and port (Only used when xCache, APC and APCu are absent.) */
|
||||
"memcached_server" => array('localhost', 11211),
|
||||
|
||||
/* How long should ownCloud keep deleted files in the trash bin, default value: 30 days */
|
||||
'trashbin_retention_obligation' => 30,
|
||||
|
||||
/* Disable/Enable auto expire for the trash bin, by default auto expire is enabled */
|
||||
'trashbin_auto_expire' => true,
|
||||
|
||||
/* allow user to change his display name, if it is supported by the back-end */
|
||||
'allow_user_to_change_display_name' => true,
|
||||
|
||||
@@ -185,8 +191,8 @@ $CONFIG = array(
|
||||
// "datadirectory" => "",
|
||||
|
||||
/* Enable maintenance mode to disable ownCloud
|
||||
If you want to prevent users to login to ownCloud before you start doing some maintenance work,
|
||||
you need to set the value of the maintenance parameter to true.
|
||||
If you want to prevent users to login to ownCloud before you start doing some maintenance work,
|
||||
you need to set the value of the maintenance parameter to true.
|
||||
Please keep in mind that users who are already logged-in are kicked out of ownCloud instantly.
|
||||
*/
|
||||
"maintenance" => false,
|
||||
|
||||
@@ -0,0 +1,61 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright (c) 2014 Arthur Schiwon <blizzz@owncloud.com>
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
namespace OC\Core\Command\User;
|
||||
|
||||
use Symfony\Component\Console\Command\Command;
|
||||
use Symfony\Component\Console\Input\InputArgument;
|
||||
use Symfony\Component\Console\Input\InputInterface;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
use Symfony\Component\Console\Helper\TableHelper;
|
||||
|
||||
class Report extends Command {
|
||||
protected function configure() {
|
||||
$this
|
||||
->setName('user:report')
|
||||
->setDescription('shows how many users have access');
|
||||
}
|
||||
|
||||
protected function execute(InputInterface $input, OutputInterface $output) {
|
||||
$table = $this->getHelperSet()->get('table');
|
||||
$table->setHeaders(array('User Report', ''));
|
||||
$userCountArray = $this->countUsers();
|
||||
if(!empty($userCountArray)) {
|
||||
$total = 0;
|
||||
$rows = array();
|
||||
foreach($userCountArray as $classname => $users) {
|
||||
$total += $users;
|
||||
$rows[] = array($classname, $users);
|
||||
}
|
||||
|
||||
$rows[] = array(' ');
|
||||
$rows[] = array('total users', $total);
|
||||
} else {
|
||||
$rows[] = array('No backend enabled that supports user counting', '');
|
||||
}
|
||||
|
||||
$userDirectoryCount = $this->countUserDirectories();
|
||||
$rows[] = array(' ');
|
||||
$rows[] = array('user directories', $userDirectoryCount);
|
||||
|
||||
$table->setRows($rows);
|
||||
$table->render($output);
|
||||
}
|
||||
|
||||
private function countUsers() {
|
||||
\OC_App::loadApps(array('authentication'));
|
||||
$userManager = \OC::$server->getUserManager();
|
||||
return $userManager->countUsers();
|
||||
}
|
||||
|
||||
private function countUserDirectories() {
|
||||
$dataview = new \OC\Files\View('/');
|
||||
$userDirectories = $dataview->getDirectoryContent('/', 'httpd/unix-directory');
|
||||
return count($userDirectories);
|
||||
}
|
||||
}
|
||||
+21
-6
@@ -105,8 +105,8 @@ textarea:hover, textarea:focus, textarea:active {
|
||||
input[type="checkbox"] { margin:0; padding:0; height:auto; width:auto; }
|
||||
input[type="checkbox"]:hover+label, input[type="checkbox"]:focus+label { color:#111 !important; }
|
||||
input[type="time"] {
|
||||
width: 110px;
|
||||
height: 30px;
|
||||
width: initial;
|
||||
height: 31px;
|
||||
-moz-box-sizing: border-box; box-sizing: border-box;
|
||||
}
|
||||
#quota {
|
||||
@@ -202,13 +202,20 @@ input[type="submit"].enabled {
|
||||
box-sizing: border-box;
|
||||
position: fixed;
|
||||
right: 0;
|
||||
left: 80px;
|
||||
left: 0;
|
||||
height: 44px;
|
||||
width: 100%;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
background: #eee;
|
||||
border-bottom: 1px solid #e7e7e7;
|
||||
z-index: 50;
|
||||
}
|
||||
/* account for shift of controls bar due to app navigation */
|
||||
#body-user #controls,
|
||||
#body-settings #controls {
|
||||
padding-left: 80px;
|
||||
}
|
||||
#controls .button,
|
||||
#controls button,
|
||||
#controls input[type='submit'],
|
||||
@@ -822,15 +829,23 @@ span.ui-icon {float: left; margin: 3px 7px 30px 0;}
|
||||
#tagsdialog .taglist li:hover, #tagsdialog .taglist li:active { background:#eee; }
|
||||
#tagsdialog .addinput { width: 90%; clear: both; }
|
||||
|
||||
/* ---- APP SETTINGS ---- */
|
||||
.popup { background-color:white; border-radius:10px 10px 10px 10px; box-shadow:0 0 20px #888; color:#333; padding:10px; position:fixed !important; z-index:100; }
|
||||
/* ---- APP SETTINGS - LEGACY, DO NOT USE THE POPUP! ---- */
|
||||
.popup {
|
||||
background-color: #fff;
|
||||
border-radius: 3px;
|
||||
box-shadow: 0 0 10px #aaa;
|
||||
color: #333;
|
||||
padding: 10px;
|
||||
position: fixed !important;
|
||||
z-index: 100;
|
||||
}
|
||||
.popup.topright { top:7em; right:1em; }
|
||||
.popup.bottomleft { bottom:1em; left:33em; }
|
||||
.popup .close { position:absolute; top:0.2em; right:0.2em; height:20px; width:20px; background:url('../img/actions/close.svg') no-repeat center; }
|
||||
.popup h2 { font-weight:bold; font-size:1.2em; }
|
||||
.arrow { border-bottom:10px solid white; border-left:10px solid transparent; border-right:10px solid transparent; display:block; height:0; position:absolute; width:0; z-index:201; }
|
||||
.arrow.left { left:-13px; bottom:1.2em; -webkit-transform:rotate(270deg); -moz-transform:rotate(270deg); -o-transform:rotate(270deg); -ms-transform:rotate(270deg); transform:rotate(270deg); }
|
||||
.arrow.up { top:-8px; right:2em; }
|
||||
.arrow.up { top:-8px; right:6px; }
|
||||
.arrow.down { -webkit-transform:rotate(180deg); -moz-transform:rotate(180deg); -o-transform:rotate(180deg); -ms-transform:rotate(180deg); transform:rotate(180deg); }
|
||||
.help-includes {
|
||||
overflow: hidden;
|
||||
|
||||
+21
-10
@@ -12,7 +12,14 @@ var oc_current_user = document.getElementsByTagName('head')[0].getAttribute('dat
|
||||
var oc_requesttoken = document.getElementsByTagName('head')[0].getAttribute('data-requesttoken');
|
||||
|
||||
if (typeof oc_webroot === "undefined") {
|
||||
oc_webroot = location.pathname.substr(0, location.pathname.lastIndexOf('/'));
|
||||
oc_webroot = location.pathname;
|
||||
var pos = oc_webroot.indexOf('/index.php/');
|
||||
if (pos !== -1) {
|
||||
oc_webroot = oc_webroot.substr(0, pos);
|
||||
}
|
||||
else {
|
||||
oc_webroot = oc_webroot.substr(0, oc_webroot.lastIndexOf('/'));
|
||||
}
|
||||
}
|
||||
if (oc_debug !== true || typeof console === "undefined" || typeof console.log === "undefined") {
|
||||
if (!window.console) {
|
||||
@@ -41,8 +48,8 @@ function initL10N(app) {
|
||||
t.cache[app] = [];
|
||||
}
|
||||
}
|
||||
if (typeof t.plural_function == 'undefined') {
|
||||
t.plural_function = function (n) {
|
||||
if (typeof t.plural_function[app] == 'undefined') {
|
||||
t.plural_function[app] = function (n) {
|
||||
var p = (n != 1) ? 1 : 0;
|
||||
return { 'nplural' : 2, 'plural' : p };
|
||||
};
|
||||
@@ -67,7 +74,7 @@ function initL10N(app) {
|
||||
Gettext._locale_data[domain].head.plural_func = eval("("+code+")");
|
||||
*/
|
||||
var code = 'var plural; var nplurals; '+pf+' return { "nplural" : nplurals, "plural" : (plural === true ? 1 : plural ? plural : 0) };';
|
||||
t.plural_function = new Function("n", code);
|
||||
t.plural_function[app] = new Function("n", code);
|
||||
} else {
|
||||
console.log("Syntax error in language file. Plural-Forms header is invalid ["+t.plural_forms+"]");
|
||||
}
|
||||
@@ -103,6 +110,10 @@ function t(app, text, vars, count){
|
||||
}
|
||||
}
|
||||
t.cache = {};
|
||||
// different apps might or might not redefine the nplurals function correctly
|
||||
// this is to make sure that a "broken" app doesn't mess up with the
|
||||
// other app's plural function
|
||||
t.plural_function = {};
|
||||
|
||||
/**
|
||||
* translate a string
|
||||
@@ -115,11 +126,11 @@ t.cache = {};
|
||||
*/
|
||||
function n(app, text_singular, text_plural, count, vars) {
|
||||
initL10N(app);
|
||||
var identifier = '_' + text_singular + '__' + text_plural + '_';
|
||||
var identifier = '_' + text_singular + '_::_' + text_plural + '_';
|
||||
if( typeof( t.cache[app][identifier] ) !== 'undefined' ){
|
||||
var translation = t.cache[app][identifier];
|
||||
if ($.isArray(translation)) {
|
||||
var plural = t.plural_function(count);
|
||||
var plural = t.plural_function[app](count);
|
||||
return t(app, translation[plural.plural], vars, count);
|
||||
}
|
||||
}
|
||||
@@ -471,11 +482,11 @@ OC.Breadcrumb={
|
||||
},
|
||||
_show:function(container, dir, leafname, leaflink){
|
||||
var self = this;
|
||||
|
||||
|
||||
this._clear(container);
|
||||
|
||||
|
||||
// show home + path in subdirectories
|
||||
if (dir && dir !== '/') {
|
||||
if (dir) {
|
||||
//add home
|
||||
var link = OC.linkTo('files','index.php');
|
||||
|
||||
@@ -502,7 +513,7 @@ OC.Breadcrumb={
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
//add leafname
|
||||
if (leafname && leaflink) {
|
||||
this._push(container, leafname, leaflink);
|
||||
|
||||
+7
-3
@@ -181,7 +181,8 @@ OC.Share={
|
||||
},
|
||||
showDropDown:function(itemType, itemSource, appendTo, link, possiblePermissions, filename) {
|
||||
var data = OC.Share.loadItem(itemType, itemSource);
|
||||
var html = '<div id="dropdown" class="drop" data-item-type="'+itemType+'" data-item-source="'+itemSource+'"" data-item-source-name="'+filename+'">';
|
||||
var dropDownEl;
|
||||
var html = '<div id="dropdown" class="drop" data-item-type="'+itemType+'" data-item-source="'+itemSource+'">';
|
||||
if (data !== false && data.reshare !== false && data.reshare.uid_owner !== undefined) {
|
||||
if (data.reshare.share_type == OC.Share.SHARE_TYPE_GROUP) {
|
||||
html += '<span class="reshare">'+t('core', 'Shared with you and the group {group} by {owner}', {group: escapeHTML(data.reshare.share_with), owner: escapeHTML(data.reshare.displayname_owner)})+'</span>';
|
||||
@@ -239,7 +240,8 @@ OC.Share={
|
||||
html += '<input type="checkbox" name="expirationCheckbox" id="expirationCheckbox" value="1" /><label for="expirationCheckbox">'+t('core', 'Set expiration date')+'</label>';
|
||||
html += '<input id="expirationDate" type="text" placeholder="'+t('core', 'Expiration date')+'" style="display:none; width:90%;" />';
|
||||
html += '</div>';
|
||||
$(html).appendTo(appendTo);
|
||||
dropDownEl = $(html);
|
||||
dropDownEl = dropDownEl.appendTo(appendTo);
|
||||
// Reset item shares
|
||||
OC.Share.itemShares = [];
|
||||
if (data.shares) {
|
||||
@@ -332,8 +334,10 @@ OC.Share={
|
||||
} else {
|
||||
html += '<input id="shareWith" type="text" placeholder="'+t('core', 'Resharing is not allowed')+'" style="width:90%;" disabled="disabled"/>';
|
||||
html += '</div>';
|
||||
$(html).appendTo(appendTo);
|
||||
dropDownEl = $(html);
|
||||
dropDownEl.appendTo(appendTo);
|
||||
}
|
||||
dropDownEl.attr('data-item-source-name', filename);
|
||||
$('#dropdown').show('blind', function() {
|
||||
OC.Share.droppedDown = true;
|
||||
});
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
<?php
|
||||
$TRANSLATIONS = array(
|
||||
"Settings" => "Настройки",
|
||||
"_%n minute ago_::_%n minutes ago_" => array("","",""),
|
||||
"_%n hour ago_::_%n hours ago_" => array("","",""),
|
||||
"_%n day ago_::_%n days ago_" => array("","",""),
|
||||
"_%n month ago_::_%n months ago_" => array("","",""),
|
||||
"Yes" => "Да",
|
||||
"No" => "Нет",
|
||||
"_{count} file conflict_::_{count} file conflicts_" => array("","",""),
|
||||
"Cancel" => "Отмена",
|
||||
"Share" => "Сделать общим",
|
||||
"Error" => "Ошибка",
|
||||
"Password" => "Пароль",
|
||||
"can edit" => "возможно редактирование",
|
||||
"Warning" => "Предупреждение",
|
||||
"Delete" => "Удалить",
|
||||
"Username" => "Имя пользователя",
|
||||
"Help" => "Помощь"
|
||||
);
|
||||
$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);";
|
||||
@@ -15,3 +15,4 @@ $application->add(new OC\Core\Command\App\Disable());
|
||||
$application->add(new OC\Core\Command\App\Enable());
|
||||
$application->add(new OC\Core\Command\App\ListApps());
|
||||
$application->add(new OC\Core\Command\Maintenance\Repair(new \OC\Repair()));
|
||||
$application->add(new OC\Core\Command\User\Report());
|
||||
|
||||
@@ -6,18 +6,19 @@
|
||||
<form action="index.php" method="post">
|
||||
<input type="hidden" name="install" value="true" />
|
||||
<?php if(count($_['errors']) > 0): ?>
|
||||
<ul class="errors">
|
||||
<fieldset class="warning">
|
||||
<legend><strong><?php p($l->t('Error'));?></strong></legend>
|
||||
<?php foreach($_['errors'] as $err): ?>
|
||||
<li>
|
||||
<p>
|
||||
<?php if(is_array($err)):?>
|
||||
<?php print_unescaped($err['error']); ?>
|
||||
<p class='hint'><?php print_unescaped($err['hint']); ?></p>
|
||||
<span class='hint'><?php print_unescaped($err['hint']); ?></span>
|
||||
<?php else: ?>
|
||||
<?php print_unescaped($err); ?>
|
||||
<?php endif; ?>
|
||||
</li>
|
||||
</p>
|
||||
<?php endforeach; ?>
|
||||
</ul>
|
||||
</fieldset>
|
||||
<?php endif; ?>
|
||||
<?php if($_['vulnerableToNullByte']): ?>
|
||||
<fieldset class="warning">
|
||||
@@ -53,7 +54,7 @@
|
||||
</p>
|
||||
<p class="infield groupbottom">
|
||||
<input type="password" name="adminpass" data-typetoggle="#show" id="adminpass" placeholder=""
|
||||
value="<?php p(OC_Helper::init_var('adminpass')); ?>" />
|
||||
value="<?php p(OC_Helper::init_var('adminpass')); ?>" required />
|
||||
<label for="adminpass" class="infield"><?php p($l->t( 'Password' )); ?></label>
|
||||
<img class="svg" id="adminpass-icon" src="<?php print_unescaped(image_path('', 'actions/password.svg')); ?>" alt="" />
|
||||
<input type="checkbox" id="show" name="show" />
|
||||
|
||||
@@ -50,6 +50,8 @@ try {
|
||||
|
||||
session_write_close();
|
||||
|
||||
$logger = \OC_Log::$object;
|
||||
|
||||
// Don't do anything if ownCloud has not been installed
|
||||
if (!OC_Config::getValue('installed', false)) {
|
||||
exit(0);
|
||||
@@ -98,7 +100,7 @@ try {
|
||||
$jobList = new \OC\BackgroundJob\JobList();
|
||||
$jobs = $jobList->getAll();
|
||||
foreach ($jobs as $job) {
|
||||
$job->execute($jobList);
|
||||
$job->execute($jobList, $logger);
|
||||
}
|
||||
} else {
|
||||
// We call cron.php from some website
|
||||
@@ -109,7 +111,7 @@ try {
|
||||
// Work and success :-)
|
||||
$jobList = new \OC\BackgroundJob\JobList();
|
||||
$job = $jobList->getNext();
|
||||
$job->execute($jobList);
|
||||
$job->execute($jobList, $logger);
|
||||
$jobList->setLastJob($job);
|
||||
OC_JSON::success();
|
||||
}
|
||||
|
||||
@@ -1,773 +0,0 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
#
|
||||
# Translators:
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ownCloud\n"
|
||||
"Report-Msgid-Bugs-To: translations@owncloud.org\n"
|
||||
"POT-Creation-Date: 2013-11-26 10:45-0500\n"
|
||||
"PO-Revision-Date: 2013-11-26 15:45+0000\n"
|
||||
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
|
||||
"Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/owncloud/language/ru_RU/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: ru_RU\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||
|
||||
#: ajax/share.php:119 ajax/share.php:198
|
||||
#, php-format
|
||||
msgid "%s shared »%s« with you"
|
||||
msgstr ""
|
||||
|
||||
#: ajax/share.php:169
|
||||
#, php-format
|
||||
msgid "Couldn't send mail to following users: %s "
|
||||
msgstr ""
|
||||
|
||||
#: ajax/update.php:11
|
||||
msgid "Turned on maintenance mode"
|
||||
msgstr ""
|
||||
|
||||
#: ajax/update.php:14
|
||||
msgid "Turned off maintenance mode"
|
||||
msgstr ""
|
||||
|
||||
#: ajax/update.php:17
|
||||
msgid "Updated database"
|
||||
msgstr ""
|
||||
|
||||
#: ajax/update.php:20
|
||||
msgid "Updating filecache, this may take really long..."
|
||||
msgstr ""
|
||||
|
||||
#: ajax/update.php:23
|
||||
msgid "Updated filecache"
|
||||
msgstr ""
|
||||
|
||||
#: ajax/update.php:26
|
||||
#, php-format
|
||||
msgid "... %d%% done ..."
|
||||
msgstr ""
|
||||
|
||||
#: avatar/controller.php:62
|
||||
msgid "No image or file provided"
|
||||
msgstr ""
|
||||
|
||||
#: avatar/controller.php:81
|
||||
msgid "Unknown filetype"
|
||||
msgstr ""
|
||||
|
||||
#: avatar/controller.php:85
|
||||
msgid "Invalid image"
|
||||
msgstr ""
|
||||
|
||||
#: avatar/controller.php:115 avatar/controller.php:142
|
||||
msgid "No temporary profile picture available, try again"
|
||||
msgstr ""
|
||||
|
||||
#: avatar/controller.php:135
|
||||
msgid "No crop data provided"
|
||||
msgstr ""
|
||||
|
||||
#: js/config.php:32
|
||||
msgid "Sunday"
|
||||
msgstr ""
|
||||
|
||||
#: js/config.php:33
|
||||
msgid "Monday"
|
||||
msgstr ""
|
||||
|
||||
#: js/config.php:34
|
||||
msgid "Tuesday"
|
||||
msgstr ""
|
||||
|
||||
#: js/config.php:35
|
||||
msgid "Wednesday"
|
||||
msgstr ""
|
||||
|
||||
#: js/config.php:36
|
||||
msgid "Thursday"
|
||||
msgstr ""
|
||||
|
||||
#: js/config.php:37
|
||||
msgid "Friday"
|
||||
msgstr ""
|
||||
|
||||
#: js/config.php:38
|
||||
msgid "Saturday"
|
||||
msgstr ""
|
||||
|
||||
#: js/config.php:43
|
||||
msgid "January"
|
||||
msgstr ""
|
||||
|
||||
#: js/config.php:44
|
||||
msgid "February"
|
||||
msgstr ""
|
||||
|
||||
#: js/config.php:45
|
||||
msgid "March"
|
||||
msgstr ""
|
||||
|
||||
#: js/config.php:46
|
||||
msgid "April"
|
||||
msgstr ""
|
||||
|
||||
#: js/config.php:47
|
||||
msgid "May"
|
||||
msgstr ""
|
||||
|
||||
#: js/config.php:48
|
||||
msgid "June"
|
||||
msgstr ""
|
||||
|
||||
#: js/config.php:49
|
||||
msgid "July"
|
||||
msgstr ""
|
||||
|
||||
#: js/config.php:50
|
||||
msgid "August"
|
||||
msgstr ""
|
||||
|
||||
#: js/config.php:51
|
||||
msgid "September"
|
||||
msgstr ""
|
||||
|
||||
#: js/config.php:52
|
||||
msgid "October"
|
||||
msgstr ""
|
||||
|
||||
#: js/config.php:53
|
||||
msgid "November"
|
||||
msgstr ""
|
||||
|
||||
#: js/config.php:54
|
||||
msgid "December"
|
||||
msgstr ""
|
||||
|
||||
#: js/js.js:387
|
||||
msgid "Settings"
|
||||
msgstr "Настройки"
|
||||
|
||||
#: js/js.js:858
|
||||
msgid "seconds ago"
|
||||
msgstr ""
|
||||
|
||||
#: js/js.js:859
|
||||
msgid "%n minute ago"
|
||||
msgid_plural "%n minutes ago"
|
||||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
msgstr[2] ""
|
||||
|
||||
#: js/js.js:860
|
||||
msgid "%n hour ago"
|
||||
msgid_plural "%n hours ago"
|
||||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
msgstr[2] ""
|
||||
|
||||
#: js/js.js:861
|
||||
msgid "today"
|
||||
msgstr ""
|
||||
|
||||
#: js/js.js:862
|
||||
msgid "yesterday"
|
||||
msgstr ""
|
||||
|
||||
#: js/js.js:863
|
||||
msgid "%n day ago"
|
||||
msgid_plural "%n days ago"
|
||||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
msgstr[2] ""
|
||||
|
||||
#: js/js.js:864
|
||||
msgid "last month"
|
||||
msgstr ""
|
||||
|
||||
#: js/js.js:865
|
||||
msgid "%n month ago"
|
||||
msgid_plural "%n months ago"
|
||||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
msgstr[2] ""
|
||||
|
||||
#: js/js.js:866
|
||||
msgid "months ago"
|
||||
msgstr ""
|
||||
|
||||
#: js/js.js:867
|
||||
msgid "last year"
|
||||
msgstr ""
|
||||
|
||||
#: js/js.js:868
|
||||
msgid "years ago"
|
||||
msgstr ""
|
||||
|
||||
#: js/oc-dialogs.js:123
|
||||
msgid "Choose"
|
||||
msgstr ""
|
||||
|
||||
#: js/oc-dialogs.js:146
|
||||
msgid "Error loading file picker template: {error}"
|
||||
msgstr ""
|
||||
|
||||
#: js/oc-dialogs.js:172
|
||||
msgid "Yes"
|
||||
msgstr "Да"
|
||||
|
||||
#: js/oc-dialogs.js:182
|
||||
msgid "No"
|
||||
msgstr "Нет"
|
||||
|
||||
#: js/oc-dialogs.js:199
|
||||
msgid "Ok"
|
||||
msgstr ""
|
||||
|
||||
#: js/oc-dialogs.js:219
|
||||
msgid "Error loading message template: {error}"
|
||||
msgstr ""
|
||||
|
||||
#: js/oc-dialogs.js:347
|
||||
msgid "{count} file conflict"
|
||||
msgid_plural "{count} file conflicts"
|
||||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
msgstr[2] ""
|
||||
|
||||
#: js/oc-dialogs.js:361
|
||||
msgid "One file conflict"
|
||||
msgstr ""
|
||||
|
||||
#: js/oc-dialogs.js:367
|
||||
msgid "Which files do you want to keep?"
|
||||
msgstr ""
|
||||
|
||||
#: js/oc-dialogs.js:368
|
||||
msgid ""
|
||||
"If you select both versions, the copied file will have a number added to its"
|
||||
" name."
|
||||
msgstr ""
|
||||
|
||||
#: js/oc-dialogs.js:376
|
||||
msgid "Cancel"
|
||||
msgstr "Отмена"
|
||||
|
||||
#: js/oc-dialogs.js:386
|
||||
msgid "Continue"
|
||||
msgstr ""
|
||||
|
||||
#: js/oc-dialogs.js:433 js/oc-dialogs.js:446
|
||||
msgid "(all selected)"
|
||||
msgstr ""
|
||||
|
||||
#: js/oc-dialogs.js:436 js/oc-dialogs.js:449
|
||||
msgid "({count} selected)"
|
||||
msgstr ""
|
||||
|
||||
#: js/oc-dialogs.js:457
|
||||
msgid "Error loading file exists template"
|
||||
msgstr ""
|
||||
|
||||
#: js/share.js:51 js/share.js:66 js/share.js:106
|
||||
msgid "Shared"
|
||||
msgstr ""
|
||||
|
||||
#: js/share.js:109
|
||||
msgid "Share"
|
||||
msgstr "Сделать общим"
|
||||
|
||||
#: js/share.js:158 js/share.js:171 js/share.js:178 js/share.js:707
|
||||
#: js/share.js:719
|
||||
msgid "Error"
|
||||
msgstr "Ошибка"
|
||||
|
||||
#: js/share.js:160 js/share.js:747
|
||||
msgid "Error while sharing"
|
||||
msgstr ""
|
||||
|
||||
#: js/share.js:171
|
||||
msgid "Error while unsharing"
|
||||
msgstr ""
|
||||
|
||||
#: js/share.js:178
|
||||
msgid "Error while changing permissions"
|
||||
msgstr ""
|
||||
|
||||
#: js/share.js:187
|
||||
msgid "Shared with you and the group {group} by {owner}"
|
||||
msgstr ""
|
||||
|
||||
#: js/share.js:189
|
||||
msgid "Shared with you by {owner}"
|
||||
msgstr ""
|
||||
|
||||
#: js/share.js:213
|
||||
msgid "Share with user or group …"
|
||||
msgstr ""
|
||||
|
||||
#: js/share.js:219
|
||||
msgid "Share link"
|
||||
msgstr ""
|
||||
|
||||
#: js/share.js:222
|
||||
msgid "Password protect"
|
||||
msgstr ""
|
||||
|
||||
#: js/share.js:224 templates/installation.php:57 templates/login.php:32
|
||||
msgid "Password"
|
||||
msgstr "Пароль"
|
||||
|
||||
#: js/share.js:229
|
||||
msgid "Allow Public Upload"
|
||||
msgstr ""
|
||||
|
||||
#: js/share.js:233
|
||||
msgid "Email link to person"
|
||||
msgstr ""
|
||||
|
||||
#: js/share.js:234
|
||||
msgid "Send"
|
||||
msgstr ""
|
||||
|
||||
#: js/share.js:239
|
||||
msgid "Set expiration date"
|
||||
msgstr ""
|
||||
|
||||
#: js/share.js:240
|
||||
msgid "Expiration date"
|
||||
msgstr ""
|
||||
|
||||
#: js/share.js:275
|
||||
msgid "Share via email:"
|
||||
msgstr ""
|
||||
|
||||
#: js/share.js:278
|
||||
msgid "No people found"
|
||||
msgstr ""
|
||||
|
||||
#: js/share.js:322 js/share.js:359
|
||||
msgid "group"
|
||||
msgstr ""
|
||||
|
||||
#: js/share.js:333
|
||||
msgid "Resharing is not allowed"
|
||||
msgstr ""
|
||||
|
||||
#: js/share.js:375
|
||||
msgid "Shared in {item} with {user}"
|
||||
msgstr ""
|
||||
|
||||
#: js/share.js:397
|
||||
msgid "Unshare"
|
||||
msgstr ""
|
||||
|
||||
#: js/share.js:405
|
||||
msgid "notify by email"
|
||||
msgstr ""
|
||||
|
||||
#: js/share.js:408
|
||||
msgid "can edit"
|
||||
msgstr "возможно редактирование"
|
||||
|
||||
#: js/share.js:410
|
||||
msgid "access control"
|
||||
msgstr ""
|
||||
|
||||
#: js/share.js:413
|
||||
msgid "create"
|
||||
msgstr ""
|
||||
|
||||
#: js/share.js:416
|
||||
msgid "update"
|
||||
msgstr ""
|
||||
|
||||
#: js/share.js:419
|
||||
msgid "delete"
|
||||
msgstr ""
|
||||
|
||||
#: js/share.js:422
|
||||
msgid "share"
|
||||
msgstr ""
|
||||
|
||||
#: js/share.js:464 js/share.js:694
|
||||
msgid "Password protected"
|
||||
msgstr ""
|
||||
|
||||
#: js/share.js:707
|
||||
msgid "Error unsetting expiration date"
|
||||
msgstr ""
|
||||
|
||||
#: js/share.js:719
|
||||
msgid "Error setting expiration date"
|
||||
msgstr ""
|
||||
|
||||
#: js/share.js:734
|
||||
msgid "Sending ..."
|
||||
msgstr ""
|
||||
|
||||
#: js/share.js:745
|
||||
msgid "Email sent"
|
||||
msgstr ""
|
||||
|
||||
#: js/share.js:769
|
||||
msgid "Warning"
|
||||
msgstr "Предупреждение"
|
||||
|
||||
#: js/tags.js:4
|
||||
msgid "The object type is not specified."
|
||||
msgstr ""
|
||||
|
||||
#: js/tags.js:13
|
||||
msgid "Enter new"
|
||||
msgstr ""
|
||||
|
||||
#: js/tags.js:27
|
||||
msgid "Delete"
|
||||
msgstr "Удалить"
|
||||
|
||||
#: js/tags.js:31
|
||||
msgid "Add"
|
||||
msgstr ""
|
||||
|
||||
#: js/tags.js:39
|
||||
msgid "Edit tags"
|
||||
msgstr ""
|
||||
|
||||
#: js/tags.js:57
|
||||
msgid "Error loading dialog template: {error}"
|
||||
msgstr ""
|
||||
|
||||
#: js/tags.js:261
|
||||
msgid "No tags selected for deletion."
|
||||
msgstr ""
|
||||
|
||||
#: js/update.js:8
|
||||
msgid "Please reload the page."
|
||||
msgstr ""
|
||||
|
||||
#: js/update.js:17
|
||||
msgid ""
|
||||
"The update was unsuccessful. Please report this issue to the <a "
|
||||
"href=\"https://github.com/owncloud/core/issues\" target=\"_blank\">ownCloud "
|
||||
"community</a>."
|
||||
msgstr ""
|
||||
|
||||
#: js/update.js:21
|
||||
msgid "The update was successful. Redirecting you to ownCloud now."
|
||||
msgstr ""
|
||||
|
||||
#: lostpassword/controller.php:62
|
||||
#, php-format
|
||||
msgid "%s password reset"
|
||||
msgstr ""
|
||||
|
||||
#: lostpassword/templates/email.php:2
|
||||
msgid "Use the following link to reset your password: {link}"
|
||||
msgstr ""
|
||||
|
||||
#: lostpassword/templates/lostpassword.php:7
|
||||
msgid ""
|
||||
"The link to reset your password has been sent to your email.<br>If you do "
|
||||
"not receive it within a reasonable amount of time, check your spam/junk "
|
||||
"folders.<br>If it is not there ask your local administrator ."
|
||||
msgstr ""
|
||||
|
||||
#: lostpassword/templates/lostpassword.php:15
|
||||
msgid "Request failed!<br>Did you make sure your email/username was right?"
|
||||
msgstr ""
|
||||
|
||||
#: lostpassword/templates/lostpassword.php:18
|
||||
msgid "You will receive a link to reset your password via Email."
|
||||
msgstr ""
|
||||
|
||||
#: lostpassword/templates/lostpassword.php:21 templates/installation.php:51
|
||||
#: templates/login.php:25
|
||||
msgid "Username"
|
||||
msgstr "Имя пользователя"
|
||||
|
||||
#: lostpassword/templates/lostpassword.php:25
|
||||
msgid ""
|
||||
"Your files are encrypted. If you haven't enabled the recovery key, there "
|
||||
"will be no way to get your data back after your password is reset. If you "
|
||||
"are not sure what to do, please contact your administrator before you "
|
||||
"continue. Do you really want to continue?"
|
||||
msgstr ""
|
||||
|
||||
#: lostpassword/templates/lostpassword.php:27
|
||||
msgid "Yes, I really want to reset my password now"
|
||||
msgstr ""
|
||||
|
||||
#: lostpassword/templates/lostpassword.php:30
|
||||
msgid "Reset"
|
||||
msgstr ""
|
||||
|
||||
#: lostpassword/templates/resetpassword.php:4
|
||||
msgid "Your password was reset"
|
||||
msgstr ""
|
||||
|
||||
#: lostpassword/templates/resetpassword.php:5
|
||||
msgid "To login page"
|
||||
msgstr ""
|
||||
|
||||
#: lostpassword/templates/resetpassword.php:8
|
||||
msgid "New password"
|
||||
msgstr ""
|
||||
|
||||
#: lostpassword/templates/resetpassword.php:11
|
||||
msgid "Reset password"
|
||||
msgstr ""
|
||||
|
||||
#: strings.php:5
|
||||
msgid "Personal"
|
||||
msgstr ""
|
||||
|
||||
#: strings.php:6
|
||||
msgid "Users"
|
||||
msgstr ""
|
||||
|
||||
#: strings.php:7 templates/layout.user.php:110
|
||||
msgid "Apps"
|
||||
msgstr ""
|
||||
|
||||
#: strings.php:8
|
||||
msgid "Admin"
|
||||
msgstr ""
|
||||
|
||||
#: strings.php:9
|
||||
msgid "Help"
|
||||
msgstr "Помощь"
|
||||
|
||||
#: tags/controller.php:22
|
||||
msgid "Error loading tags"
|
||||
msgstr ""
|
||||
|
||||
#: tags/controller.php:48
|
||||
msgid "Tag already exists"
|
||||
msgstr ""
|
||||
|
||||
#: tags/controller.php:64
|
||||
msgid "Error deleting tag(s)"
|
||||
msgstr ""
|
||||
|
||||
#: tags/controller.php:75
|
||||
msgid "Error tagging"
|
||||
msgstr ""
|
||||
|
||||
#: tags/controller.php:86
|
||||
msgid "Error untagging"
|
||||
msgstr ""
|
||||
|
||||
#: tags/controller.php:97
|
||||
msgid "Error favoriting"
|
||||
msgstr ""
|
||||
|
||||
#: tags/controller.php:108
|
||||
msgid "Error unfavoriting"
|
||||
msgstr ""
|
||||
|
||||
#: templates/403.php:12
|
||||
msgid "Access forbidden"
|
||||
msgstr ""
|
||||
|
||||
#: templates/404.php:15
|
||||
msgid "Cloud not found"
|
||||
msgstr ""
|
||||
|
||||
#: templates/altmail.php:2
|
||||
#, php-format
|
||||
msgid ""
|
||||
"Hey there,\n"
|
||||
"\n"
|
||||
"just letting you know that %s shared %s with you.\n"
|
||||
"View it: %s\n"
|
||||
"\n"
|
||||
msgstr ""
|
||||
|
||||
#: templates/altmail.php:4 templates/mail.php:17
|
||||
#, php-format
|
||||
msgid "The share will expire on %s."
|
||||
msgstr ""
|
||||
|
||||
#: templates/altmail.php:7 templates/mail.php:20
|
||||
msgid "Cheers!"
|
||||
msgstr ""
|
||||
|
||||
#: templates/installation.php:24 templates/installation.php:31
|
||||
#: templates/installation.php:38
|
||||
msgid "Security Warning"
|
||||
msgstr ""
|
||||
|
||||
#: templates/installation.php:25
|
||||
msgid "Your PHP version is vulnerable to the NULL Byte attack (CVE-2006-7243)"
|
||||
msgstr ""
|
||||
|
||||
#: templates/installation.php:26
|
||||
#, php-format
|
||||
msgid "Please update your PHP installation to use %s securely."
|
||||
msgstr ""
|
||||
|
||||
#: templates/installation.php:32
|
||||
msgid ""
|
||||
"No secure random number generator is available, please enable the PHP "
|
||||
"OpenSSL extension."
|
||||
msgstr ""
|
||||
|
||||
#: templates/installation.php:33
|
||||
msgid ""
|
||||
"Without a secure random number generator an attacker may be able to predict "
|
||||
"password reset tokens and take over your account."
|
||||
msgstr ""
|
||||
|
||||
#: templates/installation.php:39
|
||||
msgid ""
|
||||
"Your data directory and files are probably accessible from the internet "
|
||||
"because the .htaccess file does not work."
|
||||
msgstr ""
|
||||
|
||||
#: templates/installation.php:41
|
||||
#, php-format
|
||||
msgid ""
|
||||
"For information how to properly configure your server, please see the <a "
|
||||
"href=\"%s\" target=\"_blank\">documentation</a>."
|
||||
msgstr ""
|
||||
|
||||
#: templates/installation.php:47
|
||||
msgid "Create an <strong>admin account</strong>"
|
||||
msgstr ""
|
||||
|
||||
#: templates/installation.php:66
|
||||
msgid "Advanced"
|
||||
msgstr ""
|
||||
|
||||
#: templates/installation.php:73
|
||||
msgid "Data folder"
|
||||
msgstr ""
|
||||
|
||||
#: templates/installation.php:85
|
||||
msgid "Configure the database"
|
||||
msgstr ""
|
||||
|
||||
#: templates/installation.php:90 templates/installation.php:102
|
||||
#: templates/installation.php:113 templates/installation.php:124
|
||||
#: templates/installation.php:136
|
||||
msgid "will be used"
|
||||
msgstr ""
|
||||
|
||||
#: templates/installation.php:148
|
||||
msgid "Database user"
|
||||
msgstr ""
|
||||
|
||||
#: templates/installation.php:155
|
||||
msgid "Database password"
|
||||
msgstr ""
|
||||
|
||||
#: templates/installation.php:160
|
||||
msgid "Database name"
|
||||
msgstr ""
|
||||
|
||||
#: templates/installation.php:168
|
||||
msgid "Database tablespace"
|
||||
msgstr ""
|
||||
|
||||
#: templates/installation.php:175
|
||||
msgid "Database host"
|
||||
msgstr ""
|
||||
|
||||
#: templates/installation.php:184
|
||||
msgid "Finish setup"
|
||||
msgstr ""
|
||||
|
||||
#: templates/installation.php:184
|
||||
msgid "Finishing …"
|
||||
msgstr ""
|
||||
|
||||
#: templates/layout.user.php:43
|
||||
#, php-format
|
||||
msgid "%s is available. Get more information on how to update."
|
||||
msgstr ""
|
||||
|
||||
#: templates/layout.user.php:71 templates/singleuser.user.php:8
|
||||
msgid "Log out"
|
||||
msgstr ""
|
||||
|
||||
#: templates/login.php:9
|
||||
msgid "Automatic logon rejected!"
|
||||
msgstr ""
|
||||
|
||||
#: templates/login.php:10
|
||||
msgid ""
|
||||
"If you did not change your password recently, your account may be "
|
||||
"compromised!"
|
||||
msgstr ""
|
||||
|
||||
#: templates/login.php:12
|
||||
msgid "Please change your password to secure your account again."
|
||||
msgstr ""
|
||||
|
||||
#: templates/login.php:17
|
||||
msgid "Server side authentication failed!"
|
||||
msgstr ""
|
||||
|
||||
#: templates/login.php:18
|
||||
msgid "Please contact your administrator."
|
||||
msgstr ""
|
||||
|
||||
#: templates/login.php:38
|
||||
msgid "Lost your password?"
|
||||
msgstr ""
|
||||
|
||||
#: templates/login.php:43
|
||||
msgid "remember"
|
||||
msgstr ""
|
||||
|
||||
#: templates/login.php:46
|
||||
msgid "Log in"
|
||||
msgstr ""
|
||||
|
||||
#: templates/login.php:52
|
||||
msgid "Alternative Logins"
|
||||
msgstr ""
|
||||
|
||||
#: templates/mail.php:15
|
||||
#, php-format
|
||||
msgid ""
|
||||
"Hey there,<br><br>just letting you know that %s shared »%s« with you.<br><a "
|
||||
"href=\"%s\">View it!</a><br><br>"
|
||||
msgstr ""
|
||||
|
||||
#: templates/singleuser.user.php:3
|
||||
msgid "This ownCloud instance is currently in single user mode."
|
||||
msgstr ""
|
||||
|
||||
#: templates/singleuser.user.php:4
|
||||
msgid "This means only administrators can use the instance."
|
||||
msgstr ""
|
||||
|
||||
#: templates/singleuser.user.php:5 templates/update.user.php:5
|
||||
msgid ""
|
||||
"Contact your system administrator if this message persists or appeared "
|
||||
"unexpectedly."
|
||||
msgstr ""
|
||||
|
||||
#: templates/singleuser.user.php:7 templates/update.user.php:6
|
||||
msgid "Thank you for your patience."
|
||||
msgstr ""
|
||||
|
||||
#: templates/update.admin.php:3
|
||||
#, php-format
|
||||
msgid "Updating ownCloud to version %s, this may take a while."
|
||||
msgstr ""
|
||||
|
||||
#: templates/update.user.php:3
|
||||
msgid ""
|
||||
"This ownCloud instance is currently being updated, which may take a while."
|
||||
msgstr ""
|
||||
|
||||
#: templates/update.user.php:4
|
||||
msgid "Please reload this page after a short time to continue using ownCloud."
|
||||
msgstr ""
|
||||
@@ -1,411 +0,0 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
#
|
||||
# Translators:
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ownCloud\n"
|
||||
"Report-Msgid-Bugs-To: translations@owncloud.org\n"
|
||||
"POT-Creation-Date: 2013-11-29 14:08-0500\n"
|
||||
"PO-Revision-Date: 2013-11-29 19:08+0000\n"
|
||||
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
|
||||
"Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/owncloud/language/ru_RU/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: ru_RU\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||
|
||||
#: ajax/move.php:17
|
||||
#, php-format
|
||||
msgid "Could not move %s - File with this name already exists"
|
||||
msgstr ""
|
||||
|
||||
#: ajax/move.php:27 ajax/move.php:30
|
||||
#, php-format
|
||||
msgid "Could not move %s"
|
||||
msgstr ""
|
||||
|
||||
#: ajax/newfile.php:56 js/files.js:74
|
||||
msgid "File name cannot be empty."
|
||||
msgstr ""
|
||||
|
||||
#: ajax/newfile.php:62
|
||||
msgid "File name must not contain \"/\". Please choose a different name."
|
||||
msgstr ""
|
||||
|
||||
#: ajax/newfile.php:72 ajax/newfolder.php:37 lib/app.php:67
|
||||
#, php-format
|
||||
msgid ""
|
||||
"The name %s is already used in the folder %s. Please choose a different "
|
||||
"name."
|
||||
msgstr ""
|
||||
|
||||
#: ajax/newfile.php:81
|
||||
msgid "Not a valid source"
|
||||
msgstr ""
|
||||
|
||||
#: ajax/newfile.php:94
|
||||
#, php-format
|
||||
msgid "Error while downloading %s to %s"
|
||||
msgstr ""
|
||||
|
||||
#: ajax/newfile.php:128
|
||||
msgid "Error when creating the file"
|
||||
msgstr ""
|
||||
|
||||
#: ajax/newfolder.php:21
|
||||
msgid "Folder name cannot be empty."
|
||||
msgstr ""
|
||||
|
||||
#: ajax/newfolder.php:27
|
||||
msgid "Folder name must not contain \"/\". Please choose a different name."
|
||||
msgstr ""
|
||||
|
||||
#: ajax/newfolder.php:56
|
||||
msgid "Error when creating the folder"
|
||||
msgstr ""
|
||||
|
||||
#: ajax/upload.php:18 ajax/upload.php:50
|
||||
msgid "Unable to set upload directory."
|
||||
msgstr ""
|
||||
|
||||
#: ajax/upload.php:27
|
||||
msgid "Invalid Token"
|
||||
msgstr ""
|
||||
|
||||
#: ajax/upload.php:64
|
||||
msgid "No file was uploaded. Unknown error"
|
||||
msgstr ""
|
||||
|
||||
#: ajax/upload.php:71
|
||||
msgid "There is no error, the file uploaded with success"
|
||||
msgstr ""
|
||||
|
||||
#: ajax/upload.php:72
|
||||
msgid ""
|
||||
"The uploaded file exceeds the upload_max_filesize directive in php.ini: "
|
||||
msgstr ""
|
||||
|
||||
#: ajax/upload.php:74
|
||||
msgid ""
|
||||
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in "
|
||||
"the HTML form"
|
||||
msgstr ""
|
||||
|
||||
#: ajax/upload.php:75
|
||||
msgid "The uploaded file was only partially uploaded"
|
||||
msgstr ""
|
||||
|
||||
#: ajax/upload.php:76
|
||||
msgid "No file was uploaded"
|
||||
msgstr ""
|
||||
|
||||
#: ajax/upload.php:77
|
||||
msgid "Missing a temporary folder"
|
||||
msgstr ""
|
||||
|
||||
#: ajax/upload.php:78
|
||||
msgid "Failed to write to disk"
|
||||
msgstr ""
|
||||
|
||||
#: ajax/upload.php:96
|
||||
msgid "Not enough storage available"
|
||||
msgstr ""
|
||||
|
||||
#: ajax/upload.php:127 ajax/upload.php:154
|
||||
msgid "Upload failed. Could not get file info."
|
||||
msgstr ""
|
||||
|
||||
#: ajax/upload.php:144
|
||||
msgid "Upload failed. Could not find uploaded file"
|
||||
msgstr ""
|
||||
|
||||
#: ajax/upload.php:172
|
||||
msgid "Invalid directory."
|
||||
msgstr ""
|
||||
|
||||
#: appinfo/app.php:11
|
||||
msgid "Files"
|
||||
msgstr "Файлы"
|
||||
|
||||
#: js/file-upload.js:228
|
||||
msgid "Unable to upload {filename} as it is a directory or has 0 bytes"
|
||||
msgstr ""
|
||||
|
||||
#: js/file-upload.js:239
|
||||
msgid "Not enough space available"
|
||||
msgstr ""
|
||||
|
||||
#: js/file-upload.js:306
|
||||
msgid "Upload cancelled."
|
||||
msgstr ""
|
||||
|
||||
#: js/file-upload.js:344
|
||||
msgid "Could not get result from server."
|
||||
msgstr ""
|
||||
|
||||
#: js/file-upload.js:436
|
||||
msgid ""
|
||||
"File upload is in progress. Leaving the page now will cancel the upload."
|
||||
msgstr ""
|
||||
|
||||
#: js/file-upload.js:523
|
||||
msgid "URL cannot be empty"
|
||||
msgstr ""
|
||||
|
||||
#: js/file-upload.js:527 js/filelist.js:377
|
||||
msgid "In the home folder 'Shared' is a reserved filename"
|
||||
msgstr ""
|
||||
|
||||
#: js/file-upload.js:529 js/filelist.js:379
|
||||
msgid "{new_name} already exists"
|
||||
msgstr ""
|
||||
|
||||
#: js/file-upload.js:595
|
||||
msgid "Could not create file"
|
||||
msgstr ""
|
||||
|
||||
#: js/file-upload.js:611
|
||||
msgid "Could not create folder"
|
||||
msgstr ""
|
||||
|
||||
#: js/fileactions.js:125
|
||||
msgid "Share"
|
||||
msgstr "Сделать общим"
|
||||
|
||||
#: js/fileactions.js:137
|
||||
msgid "Delete permanently"
|
||||
msgstr ""
|
||||
|
||||
#: js/fileactions.js:194
|
||||
msgid "Rename"
|
||||
msgstr "Переименовать"
|
||||
|
||||
#: js/filelist.js:69 js/filelist.js:72 js/filelist.js:889
|
||||
msgid "Pending"
|
||||
msgstr ""
|
||||
|
||||
#: js/filelist.js:405
|
||||
msgid "Could not rename file"
|
||||
msgstr ""
|
||||
|
||||
#: js/filelist.js:539
|
||||
msgid "replaced {new_name} with {old_name}"
|
||||
msgstr ""
|
||||
|
||||
#: js/filelist.js:539
|
||||
msgid "undo"
|
||||
msgstr ""
|
||||
|
||||
#: js/filelist.js:591
|
||||
msgid "Error deleting file."
|
||||
msgstr ""
|
||||
|
||||
#: js/filelist.js:609 js/filelist.js:683 js/files.js:631
|
||||
msgid "%n folder"
|
||||
msgid_plural "%n folders"
|
||||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
msgstr[2] ""
|
||||
|
||||
#: js/filelist.js:610 js/filelist.js:684 js/files.js:637
|
||||
msgid "%n file"
|
||||
msgid_plural "%n files"
|
||||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
msgstr[2] ""
|
||||
|
||||
#: js/filelist.js:617
|
||||
msgid "{dirs} and {files}"
|
||||
msgstr ""
|
||||
|
||||
#: js/filelist.js:828 js/filelist.js:866
|
||||
msgid "Uploading %n file"
|
||||
msgid_plural "Uploading %n files"
|
||||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
msgstr[2] ""
|
||||
|
||||
#: js/files.js:72
|
||||
msgid "'.' is an invalid file name."
|
||||
msgstr ""
|
||||
|
||||
#: js/files.js:81
|
||||
msgid ""
|
||||
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not "
|
||||
"allowed."
|
||||
msgstr ""
|
||||
|
||||
#: js/files.js:93
|
||||
msgid "Your storage is full, files can not be updated or synced anymore!"
|
||||
msgstr ""
|
||||
|
||||
#: js/files.js:97
|
||||
msgid "Your storage is almost full ({usedSpacePercent}%)"
|
||||
msgstr ""
|
||||
|
||||
#: js/files.js:110
|
||||
msgid ""
|
||||
"Encryption App is enabled but your keys are not initialized, please log-out "
|
||||
"and log-in again"
|
||||
msgstr ""
|
||||
|
||||
#: js/files.js:114
|
||||
msgid ""
|
||||
"Invalid private key for Encryption App. Please update your private key "
|
||||
"password in your personal settings to recover access to your encrypted "
|
||||
"files."
|
||||
msgstr ""
|
||||
|
||||
#: js/files.js:118
|
||||
msgid ""
|
||||
"Encryption was disabled but your files are still encrypted. Please go to "
|
||||
"your personal settings to decrypt your files."
|
||||
msgstr ""
|
||||
|
||||
#: js/files.js:349
|
||||
msgid ""
|
||||
"Your download is being prepared. This might take some time if the files are "
|
||||
"big."
|
||||
msgstr ""
|
||||
|
||||
#: js/files.js:558 js/files.js:596
|
||||
msgid "Error moving file"
|
||||
msgstr ""
|
||||
|
||||
#: js/files.js:558 js/files.js:596
|
||||
msgid "Error"
|
||||
msgstr "Ошибка"
|
||||
|
||||
#: js/files.js:613 templates/index.php:56
|
||||
msgid "Name"
|
||||
msgstr ""
|
||||
|
||||
#: js/files.js:614 templates/index.php:68
|
||||
msgid "Size"
|
||||
msgstr "Размер"
|
||||
|
||||
#: js/files.js:615 templates/index.php:70
|
||||
msgid "Modified"
|
||||
msgstr ""
|
||||
|
||||
#: lib/app.php:60
|
||||
msgid "Invalid folder name. Usage of 'Shared' is reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/app.php:101
|
||||
#, php-format
|
||||
msgid "%s could not be renamed"
|
||||
msgstr ""
|
||||
|
||||
#: lib/helper.php:11 templates/index.php:16
|
||||
msgid "Upload"
|
||||
msgstr "Загрузка"
|
||||
|
||||
#: templates/admin.php:5
|
||||
msgid "File handling"
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin.php:7
|
||||
msgid "Maximum upload size"
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin.php:10
|
||||
msgid "max. possible: "
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin.php:15
|
||||
msgid "Needed for multi-file and folder downloads."
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin.php:17
|
||||
msgid "Enable ZIP-download"
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin.php:20
|
||||
msgid "0 is unlimited"
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin.php:22
|
||||
msgid "Maximum input size for ZIP files"
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin.php:26
|
||||
msgid "Save"
|
||||
msgstr "Сохранить"
|
||||
|
||||
#: templates/index.php:5
|
||||
msgid "New"
|
||||
msgstr ""
|
||||
|
||||
#: templates/index.php:8
|
||||
msgid "New text file"
|
||||
msgstr ""
|
||||
|
||||
#: templates/index.php:8
|
||||
msgid "Text file"
|
||||
msgstr ""
|
||||
|
||||
#: templates/index.php:10
|
||||
msgid "New folder"
|
||||
msgstr ""
|
||||
|
||||
#: templates/index.php:10
|
||||
msgid "Folder"
|
||||
msgstr ""
|
||||
|
||||
#: templates/index.php:12
|
||||
msgid "From link"
|
||||
msgstr ""
|
||||
|
||||
#: templates/index.php:29
|
||||
msgid "Deleted files"
|
||||
msgstr ""
|
||||
|
||||
#: templates/index.php:34
|
||||
msgid "Cancel upload"
|
||||
msgstr "Отмена загрузки"
|
||||
|
||||
#: templates/index.php:40
|
||||
msgid "You don’t have permission to upload or create files here"
|
||||
msgstr ""
|
||||
|
||||
#: templates/index.php:45
|
||||
msgid "Nothing in here. Upload something!"
|
||||
msgstr ""
|
||||
|
||||
#: templates/index.php:62
|
||||
msgid "Download"
|
||||
msgstr "Загрузка"
|
||||
|
||||
#: templates/index.php:75 templates/index.php:76
|
||||
msgid "Unshare"
|
||||
msgstr ""
|
||||
|
||||
#: templates/index.php:81 templates/index.php:82
|
||||
msgid "Delete"
|
||||
msgstr "Удалить"
|
||||
|
||||
#: templates/index.php:95
|
||||
msgid "Upload too large"
|
||||
msgstr ""
|
||||
|
||||
#: templates/index.php:97
|
||||
msgid ""
|
||||
"The files you are trying to upload exceed the maximum size for file uploads "
|
||||
"on this server."
|
||||
msgstr ""
|
||||
|
||||
#: templates/index.php:102
|
||||
msgid "Files are being scanned, please wait."
|
||||
msgstr ""
|
||||
|
||||
#: templates/index.php:105
|
||||
msgid "Current scanning"
|
||||
msgstr ""
|
||||
|
||||
#: templates/upgrade.php:2
|
||||
msgid "Upgrading filesystem cache..."
|
||||
msgstr ""
|
||||
@@ -1,201 +0,0 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
#
|
||||
# Translators:
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ownCloud\n"
|
||||
"Report-Msgid-Bugs-To: translations@owncloud.org\n"
|
||||
"POT-Creation-Date: 2013-11-29 14:08-0500\n"
|
||||
"PO-Revision-Date: 2013-11-29 19:08+0000\n"
|
||||
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
|
||||
"Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/owncloud/language/ru_RU/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: ru_RU\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||
|
||||
#: ajax/adminrecovery.php:29
|
||||
msgid "Recovery key successfully enabled"
|
||||
msgstr ""
|
||||
|
||||
#: ajax/adminrecovery.php:34
|
||||
msgid ""
|
||||
"Could not enable recovery key. Please check your recovery key password!"
|
||||
msgstr ""
|
||||
|
||||
#: ajax/adminrecovery.php:48
|
||||
msgid "Recovery key successfully disabled"
|
||||
msgstr ""
|
||||
|
||||
#: ajax/adminrecovery.php:53
|
||||
msgid ""
|
||||
"Could not disable recovery key. Please check your recovery key password!"
|
||||
msgstr ""
|
||||
|
||||
#: ajax/changeRecoveryPassword.php:49
|
||||
msgid "Password successfully changed."
|
||||
msgstr ""
|
||||
|
||||
#: ajax/changeRecoveryPassword.php:51
|
||||
msgid "Could not change the password. Maybe the old password was not correct."
|
||||
msgstr ""
|
||||
|
||||
#: ajax/updatePrivateKeyPassword.php:52
|
||||
msgid "Private key password successfully updated."
|
||||
msgstr ""
|
||||
|
||||
#: ajax/updatePrivateKeyPassword.php:54
|
||||
msgid ""
|
||||
"Could not update the private key password. Maybe the old password was not "
|
||||
"correct."
|
||||
msgstr ""
|
||||
|
||||
#: files/error.php:12
|
||||
msgid ""
|
||||
"Encryption app not initialized! Maybe the encryption app was re-enabled "
|
||||
"during your session. Please try to log out and log back in to initialize the"
|
||||
" encryption app."
|
||||
msgstr ""
|
||||
|
||||
#: files/error.php:16
|
||||
#, php-format
|
||||
msgid ""
|
||||
"Your private key is not valid! Likely your password was changed outside of "
|
||||
"%s (e.g. your corporate directory). You can update your private key password"
|
||||
" in your personal settings to recover access to your encrypted files."
|
||||
msgstr ""
|
||||
|
||||
#: files/error.php:19
|
||||
msgid ""
|
||||
"Can not decrypt this file, probably this is a shared file. Please ask the "
|
||||
"file owner to reshare the file with you."
|
||||
msgstr ""
|
||||
|
||||
#: files/error.php:22 files/error.php:27
|
||||
msgid ""
|
||||
"Unknown error please check your system settings or contact your "
|
||||
"administrator"
|
||||
msgstr ""
|
||||
|
||||
#: hooks/hooks.php:59
|
||||
msgid "Missing requirements."
|
||||
msgstr ""
|
||||
|
||||
#: hooks/hooks.php:60
|
||||
msgid ""
|
||||
"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL "
|
||||
"together with the PHP extension is enabled and configured properly. For now,"
|
||||
" the encryption app has been disabled."
|
||||
msgstr ""
|
||||
|
||||
#: hooks/hooks.php:273
|
||||
msgid "Following users are not set up for encryption:"
|
||||
msgstr ""
|
||||
|
||||
#: js/detect-migration.js:21
|
||||
msgid "Initial encryption started... This can take some time. Please wait."
|
||||
msgstr ""
|
||||
|
||||
#: js/settings-admin.js:13
|
||||
msgid "Saving..."
|
||||
msgstr ""
|
||||
|
||||
#: templates/invalid_private_key.php:8
|
||||
msgid "Go directly to your "
|
||||
msgstr ""
|
||||
|
||||
#: templates/invalid_private_key.php:8
|
||||
msgid "personal settings"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings-admin.php:4 templates/settings-personal.php:3
|
||||
msgid "Encryption"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings-admin.php:7
|
||||
msgid ""
|
||||
"Enable recovery key (allow to recover users files in case of password loss):"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings-admin.php:11
|
||||
msgid "Recovery key password"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings-admin.php:14
|
||||
msgid "Repeat Recovery key password"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings-admin.php:21 templates/settings-personal.php:51
|
||||
msgid "Enabled"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings-admin.php:29 templates/settings-personal.php:59
|
||||
msgid "Disabled"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings-admin.php:34
|
||||
msgid "Change recovery key password:"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings-admin.php:40
|
||||
msgid "Old Recovery key password"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings-admin.php:47
|
||||
msgid "New Recovery key password"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings-admin.php:53
|
||||
msgid "Repeat New Recovery key password"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings-admin.php:58
|
||||
msgid "Change Password"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings-personal.php:9
|
||||
msgid "Your private key password no longer match your log-in password:"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings-personal.php:12
|
||||
msgid "Set your old private key password to your current log-in password."
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings-personal.php:14
|
||||
msgid ""
|
||||
" If you don't remember your old password you can ask your administrator to "
|
||||
"recover your files."
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings-personal.php:22
|
||||
msgid "Old log-in password"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings-personal.php:28
|
||||
msgid "Current log-in password"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings-personal.php:33
|
||||
msgid "Update Private Key Password"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings-personal.php:42
|
||||
msgid "Enable password recovery:"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings-personal.php:44
|
||||
msgid ""
|
||||
"Enabling this option will allow you to reobtain access to your encrypted "
|
||||
"files in case of password loss"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings-personal.php:60
|
||||
msgid "File recovery settings updated"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings-personal.php:61
|
||||
msgid "Could not update file recovery"
|
||||
msgstr ""
|
||||
@@ -1,123 +0,0 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
#
|
||||
# Translators:
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ownCloud\n"
|
||||
"Report-Msgid-Bugs-To: translations@owncloud.org\n"
|
||||
"POT-Creation-Date: 2013-11-21 10:01-0500\n"
|
||||
"PO-Revision-Date: 2013-11-16 07:50+0000\n"
|
||||
"Last-Translator: masensio <masensio@solidgear.es>\n"
|
||||
"Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/owncloud/language/ru_RU/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: ru_RU\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||
|
||||
#: js/dropbox.js:7 js/dropbox.js:28 js/google.js:8 js/google.js:39
|
||||
msgid "Access granted"
|
||||
msgstr ""
|
||||
|
||||
#: js/dropbox.js:30 js/dropbox.js:96 js/dropbox.js:102
|
||||
msgid "Error configuring Dropbox storage"
|
||||
msgstr ""
|
||||
|
||||
#: js/dropbox.js:65 js/google.js:86
|
||||
msgid "Grant access"
|
||||
msgstr ""
|
||||
|
||||
#: js/dropbox.js:101
|
||||
msgid "Please provide a valid Dropbox app key and secret."
|
||||
msgstr ""
|
||||
|
||||
#: js/google.js:42 js/google.js:121
|
||||
msgid "Error configuring Google Drive storage"
|
||||
msgstr ""
|
||||
|
||||
#: lib/config.php:461
|
||||
msgid ""
|
||||
"<b>Warning:</b> \"smbclient\" is not installed. Mounting of CIFS/SMB shares "
|
||||
"is not possible. Please ask your system administrator to install it."
|
||||
msgstr ""
|
||||
|
||||
#: lib/config.php:465
|
||||
msgid ""
|
||||
"<b>Warning:</b> The FTP support in PHP is not enabled or installed. Mounting"
|
||||
" of FTP shares is not possible. Please ask your system administrator to "
|
||||
"install it."
|
||||
msgstr ""
|
||||
|
||||
#: lib/config.php:468
|
||||
msgid ""
|
||||
"<b>Warning:</b> The Curl support in PHP is not enabled or installed. "
|
||||
"Mounting of ownCloud / WebDAV or GoogleDrive is not possible. Please ask "
|
||||
"your system administrator to install it."
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:3
|
||||
msgid "External Storage"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:9 templates/settings.php:28
|
||||
msgid "Folder name"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:10
|
||||
msgid "External storage"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:11
|
||||
msgid "Configuration"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:12
|
||||
msgid "Options"
|
||||
msgstr "Опции"
|
||||
|
||||
#: templates/settings.php:13
|
||||
msgid "Applicable"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:33
|
||||
msgid "Add storage"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:90
|
||||
msgid "None set"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:91
|
||||
msgid "All Users"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:92
|
||||
msgid "Groups"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:100
|
||||
msgid "Users"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:113 templates/settings.php:114
|
||||
#: templates/settings.php:149 templates/settings.php:150
|
||||
msgid "Delete"
|
||||
msgstr "Удалить"
|
||||
|
||||
#: templates/settings.php:129
|
||||
msgid "Enable User External Storage"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:130
|
||||
msgid "Allow users to mount their own external storage"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:141
|
||||
msgid "SSL root certificates"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:159
|
||||
msgid "Import Root Certificate"
|
||||
msgstr ""
|
||||
@@ -1,84 +0,0 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
#
|
||||
# Translators:
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ownCloud\n"
|
||||
"Report-Msgid-Bugs-To: translations@owncloud.org\n"
|
||||
"POT-Creation-Date: 2013-11-15 22:54-0500\n"
|
||||
"PO-Revision-Date: 2013-11-13 16:11+0000\n"
|
||||
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
|
||||
"Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/owncloud/language/ru_RU/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: ru_RU\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||
|
||||
#: templates/authenticate.php:4
|
||||
msgid "This share is password-protected"
|
||||
msgstr ""
|
||||
|
||||
#: templates/authenticate.php:7
|
||||
msgid "The password is wrong. Try again."
|
||||
msgstr ""
|
||||
|
||||
#: templates/authenticate.php:10
|
||||
msgid "Password"
|
||||
msgstr "Пароль"
|
||||
|
||||
#: templates/part.404.php:3
|
||||
msgid "Sorry, this link doesn’t seem to work anymore."
|
||||
msgstr ""
|
||||
|
||||
#: templates/part.404.php:4
|
||||
msgid "Reasons might be:"
|
||||
msgstr ""
|
||||
|
||||
#: templates/part.404.php:6
|
||||
msgid "the item was removed"
|
||||
msgstr ""
|
||||
|
||||
#: templates/part.404.php:7
|
||||
msgid "the link expired"
|
||||
msgstr ""
|
||||
|
||||
#: templates/part.404.php:8
|
||||
msgid "sharing is disabled"
|
||||
msgstr ""
|
||||
|
||||
#: templates/part.404.php:10
|
||||
msgid "For more info, please ask the person who sent this link."
|
||||
msgstr ""
|
||||
|
||||
#: templates/public.php:18
|
||||
#, php-format
|
||||
msgid "%s shared the folder %s with you"
|
||||
msgstr ""
|
||||
|
||||
#: templates/public.php:21
|
||||
#, php-format
|
||||
msgid "%s shared the file %s with you"
|
||||
msgstr ""
|
||||
|
||||
#: templates/public.php:29 templates/public.php:95
|
||||
msgid "Download"
|
||||
msgstr "Загрузка"
|
||||
|
||||
#: templates/public.php:46 templates/public.php:49
|
||||
msgid "Upload"
|
||||
msgstr "Загрузка"
|
||||
|
||||
#: templates/public.php:59
|
||||
msgid "Cancel upload"
|
||||
msgstr "Отмена загрузки"
|
||||
|
||||
#: templates/public.php:92
|
||||
msgid "No preview available for"
|
||||
msgstr ""
|
||||
|
||||
#: templates/public.php:99
|
||||
msgid "Direct link"
|
||||
msgstr ""
|
||||
@@ -1,60 +0,0 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
#
|
||||
# Translators:
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ownCloud\n"
|
||||
"Report-Msgid-Bugs-To: translations@owncloud.org\n"
|
||||
"POT-Creation-Date: 2013-11-21 10:01-0500\n"
|
||||
"PO-Revision-Date: 2013-11-16 07:50+0000\n"
|
||||
"Last-Translator: masensio <masensio@solidgear.es>\n"
|
||||
"Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/owncloud/language/ru_RU/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: ru_RU\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||
|
||||
#: ajax/delete.php:42
|
||||
#, php-format
|
||||
msgid "Couldn't delete %s permanently"
|
||||
msgstr ""
|
||||
|
||||
#: ajax/undelete.php:42
|
||||
#, php-format
|
||||
msgid "Couldn't restore %s"
|
||||
msgstr ""
|
||||
|
||||
#: js/trash.js:18 js/trash.js:44 js/trash.js:121 js/trash.js:149
|
||||
msgid "Error"
|
||||
msgstr "Ошибка"
|
||||
|
||||
#: lib/trashbin.php:815 lib/trashbin.php:817
|
||||
msgid "restored"
|
||||
msgstr ""
|
||||
|
||||
#: templates/index.php:8
|
||||
msgid "Nothing in here. Your trash bin is empty!"
|
||||
msgstr ""
|
||||
|
||||
#: templates/index.php:22
|
||||
msgid "Name"
|
||||
msgstr ""
|
||||
|
||||
#: templates/index.php:25 templates/index.php:27
|
||||
msgid "Restore"
|
||||
msgstr ""
|
||||
|
||||
#: templates/index.php:33
|
||||
msgid "Deleted"
|
||||
msgstr ""
|
||||
|
||||
#: templates/index.php:36 templates/index.php:37
|
||||
msgid "Delete"
|
||||
msgstr "Удалить"
|
||||
|
||||
#: templates/part.breadcrumb.php:9
|
||||
msgid "Deleted Files"
|
||||
msgstr ""
|
||||
@@ -1,43 +0,0 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
#
|
||||
# Translators:
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ownCloud\n"
|
||||
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
|
||||
"POT-Creation-Date: 2013-10-19 08:26-0400\n"
|
||||
"PO-Revision-Date: 2013-10-18 09:15+0000\n"
|
||||
"Last-Translator: masensio <masensio@solidgear.es>\n"
|
||||
"Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/owncloud/language/ru_RU/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: ru_RU\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||
|
||||
#: ajax/rollbackVersion.php:13
|
||||
#, php-format
|
||||
msgid "Could not revert: %s"
|
||||
msgstr ""
|
||||
|
||||
#: js/versions.js:14
|
||||
msgid "Versions"
|
||||
msgstr ""
|
||||
|
||||
#: js/versions.js:60
|
||||
msgid "Failed to revert {file} to revision {timestamp}."
|
||||
msgstr ""
|
||||
|
||||
#: js/versions.js:86
|
||||
msgid "More versions..."
|
||||
msgstr ""
|
||||
|
||||
#: js/versions.js:123
|
||||
msgid "No other versions available"
|
||||
msgstr ""
|
||||
|
||||
#: js/versions.js:154
|
||||
msgid "Restore"
|
||||
msgstr ""
|
||||
@@ -1,341 +0,0 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
#
|
||||
# Translators:
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ownCloud\n"
|
||||
"Report-Msgid-Bugs-To: translations@owncloud.org\n"
|
||||
"POT-Creation-Date: 2013-11-21 10:01-0500\n"
|
||||
"PO-Revision-Date: 2013-11-21 15:01+0000\n"
|
||||
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
|
||||
"Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/owncloud/language/ru_RU/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: ru_RU\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||
|
||||
#: private/app.php:243
|
||||
#, php-format
|
||||
msgid ""
|
||||
"App \"%s\" can't be installed because it is not compatible with this version"
|
||||
" of ownCloud."
|
||||
msgstr ""
|
||||
|
||||
#: private/app.php:255
|
||||
msgid "No app name specified"
|
||||
msgstr ""
|
||||
|
||||
#: private/app.php:360
|
||||
msgid "Help"
|
||||
msgstr "Помощь"
|
||||
|
||||
#: private/app.php:373
|
||||
msgid "Personal"
|
||||
msgstr ""
|
||||
|
||||
#: private/app.php:384
|
||||
msgid "Settings"
|
||||
msgstr "Настройки"
|
||||
|
||||
#: private/app.php:396
|
||||
msgid "Users"
|
||||
msgstr ""
|
||||
|
||||
#: private/app.php:409
|
||||
msgid "Admin"
|
||||
msgstr ""
|
||||
|
||||
#: private/app.php:873
|
||||
#, php-format
|
||||
msgid "Failed to upgrade \"%s\"."
|
||||
msgstr ""
|
||||
|
||||
#: private/avatar.php:60
|
||||
msgid "Unknown filetype"
|
||||
msgstr ""
|
||||
|
||||
#: private/avatar.php:65
|
||||
msgid "Invalid image"
|
||||
msgstr ""
|
||||
|
||||
#: private/defaults.php:36
|
||||
msgid "web services under your control"
|
||||
msgstr ""
|
||||
|
||||
#: private/files.php:66 private/files.php:98
|
||||
#, php-format
|
||||
msgid "cannot open \"%s\""
|
||||
msgstr ""
|
||||
|
||||
#: private/files.php:228
|
||||
msgid "ZIP download is turned off."
|
||||
msgstr ""
|
||||
|
||||
#: private/files.php:229
|
||||
msgid "Files need to be downloaded one by one."
|
||||
msgstr ""
|
||||
|
||||
#: private/files.php:230 private/files.php:258
|
||||
msgid "Back to Files"
|
||||
msgstr ""
|
||||
|
||||
#: private/files.php:255
|
||||
msgid "Selected files too large to generate zip file."
|
||||
msgstr ""
|
||||
|
||||
#: private/files.php:256
|
||||
msgid ""
|
||||
"Please download the files separately in smaller chunks or kindly ask your "
|
||||
"administrator."
|
||||
msgstr ""
|
||||
|
||||
#: private/installer.php:63
|
||||
msgid "No source specified when installing app"
|
||||
msgstr ""
|
||||
|
||||
#: private/installer.php:70
|
||||
msgid "No href specified when installing app from http"
|
||||
msgstr ""
|
||||
|
||||
#: private/installer.php:75
|
||||
msgid "No path specified when installing app from local file"
|
||||
msgstr ""
|
||||
|
||||
#: private/installer.php:89
|
||||
#, php-format
|
||||
msgid "Archives of type %s are not supported"
|
||||
msgstr ""
|
||||
|
||||
#: private/installer.php:103
|
||||
msgid "Failed to open archive when installing app"
|
||||
msgstr ""
|
||||
|
||||
#: private/installer.php:125
|
||||
msgid "App does not provide an info.xml file"
|
||||
msgstr ""
|
||||
|
||||
#: private/installer.php:131
|
||||
msgid "App can't be installed because of not allowed code in the App"
|
||||
msgstr ""
|
||||
|
||||
#: private/installer.php:140
|
||||
msgid ""
|
||||
"App can't be installed because it is not compatible with this version of "
|
||||
"ownCloud"
|
||||
msgstr ""
|
||||
|
||||
#: private/installer.php:146
|
||||
msgid ""
|
||||
"App can't be installed because it contains the <shipped>true</shipped> tag "
|
||||
"which is not allowed for non shipped apps"
|
||||
msgstr ""
|
||||
|
||||
#: private/installer.php:159
|
||||
msgid ""
|
||||
"App can't be installed because the version in info.xml/version is not the "
|
||||
"same as the version reported from the app store"
|
||||
msgstr ""
|
||||
|
||||
#: private/installer.php:169
|
||||
msgid "App directory already exists"
|
||||
msgstr ""
|
||||
|
||||
#: private/installer.php:182
|
||||
#, php-format
|
||||
msgid "Can't create app folder. Please fix permissions. %s"
|
||||
msgstr ""
|
||||
|
||||
#: private/json.php:28
|
||||
msgid "Application is not enabled"
|
||||
msgstr ""
|
||||
|
||||
#: private/json.php:39 private/json.php:62 private/json.php:73
|
||||
msgid "Authentication error"
|
||||
msgstr ""
|
||||
|
||||
#: private/json.php:51
|
||||
msgid "Token expired. Please reload page."
|
||||
msgstr ""
|
||||
|
||||
#: private/search/provider/file.php:18 private/search/provider/file.php:36
|
||||
msgid "Files"
|
||||
msgstr "Файлы"
|
||||
|
||||
#: private/search/provider/file.php:27 private/search/provider/file.php:34
|
||||
msgid "Text"
|
||||
msgstr "Текст"
|
||||
|
||||
#: private/search/provider/file.php:30
|
||||
msgid "Images"
|
||||
msgstr ""
|
||||
|
||||
#: private/setup/abstractdatabase.php:22
|
||||
#, php-format
|
||||
msgid "%s enter the database username."
|
||||
msgstr ""
|
||||
|
||||
#: private/setup/abstractdatabase.php:25
|
||||
#, php-format
|
||||
msgid "%s enter the database name."
|
||||
msgstr ""
|
||||
|
||||
#: private/setup/abstractdatabase.php:28
|
||||
#, php-format
|
||||
msgid "%s you may not use dots in the database name"
|
||||
msgstr ""
|
||||
|
||||
#: private/setup/mssql.php:20
|
||||
#, php-format
|
||||
msgid "MS SQL username and/or password not valid: %s"
|
||||
msgstr ""
|
||||
|
||||
#: private/setup/mssql.php:21 private/setup/mysql.php:13
|
||||
#: private/setup/oci.php:114 private/setup/postgresql.php:24
|
||||
#: private/setup/postgresql.php:70
|
||||
msgid "You need to enter either an existing account or the administrator."
|
||||
msgstr ""
|
||||
|
||||
#: private/setup/mysql.php:12
|
||||
msgid "MySQL username and/or password not valid"
|
||||
msgstr ""
|
||||
|
||||
#: private/setup/mysql.php:67 private/setup/oci.php:54
|
||||
#: private/setup/oci.php:121 private/setup/oci.php:147
|
||||
#: private/setup/oci.php:154 private/setup/oci.php:165
|
||||
#: private/setup/oci.php:172 private/setup/oci.php:181
|
||||
#: private/setup/oci.php:189 private/setup/oci.php:198
|
||||
#: private/setup/oci.php:204 private/setup/postgresql.php:89
|
||||
#: private/setup/postgresql.php:98 private/setup/postgresql.php:115
|
||||
#: private/setup/postgresql.php:125 private/setup/postgresql.php:134
|
||||
#, php-format
|
||||
msgid "DB Error: \"%s\""
|
||||
msgstr ""
|
||||
|
||||
#: private/setup/mysql.php:68 private/setup/oci.php:55
|
||||
#: private/setup/oci.php:122 private/setup/oci.php:148
|
||||
#: private/setup/oci.php:155 private/setup/oci.php:166
|
||||
#: private/setup/oci.php:182 private/setup/oci.php:190
|
||||
#: private/setup/oci.php:199 private/setup/postgresql.php:90
|
||||
#: private/setup/postgresql.php:99 private/setup/postgresql.php:116
|
||||
#: private/setup/postgresql.php:126 private/setup/postgresql.php:135
|
||||
#, php-format
|
||||
msgid "Offending command was: \"%s\""
|
||||
msgstr ""
|
||||
|
||||
#: private/setup/mysql.php:85
|
||||
#, php-format
|
||||
msgid "MySQL user '%s'@'localhost' exists already."
|
||||
msgstr ""
|
||||
|
||||
#: private/setup/mysql.php:86
|
||||
msgid "Drop this user from MySQL"
|
||||
msgstr ""
|
||||
|
||||
#: private/setup/mysql.php:91
|
||||
#, php-format
|
||||
msgid "MySQL user '%s'@'%%' already exists"
|
||||
msgstr ""
|
||||
|
||||
#: private/setup/mysql.php:92
|
||||
msgid "Drop this user from MySQL."
|
||||
msgstr ""
|
||||
|
||||
#: private/setup/oci.php:34
|
||||
msgid "Oracle connection could not be established"
|
||||
msgstr ""
|
||||
|
||||
#: private/setup/oci.php:41 private/setup/oci.php:113
|
||||
msgid "Oracle username and/or password not valid"
|
||||
msgstr ""
|
||||
|
||||
#: private/setup/oci.php:173 private/setup/oci.php:205
|
||||
#, php-format
|
||||
msgid "Offending command was: \"%s\", name: %s, password: %s"
|
||||
msgstr ""
|
||||
|
||||
#: private/setup/postgresql.php:23 private/setup/postgresql.php:69
|
||||
msgid "PostgreSQL username and/or password not valid"
|
||||
msgstr ""
|
||||
|
||||
#: private/setup.php:28
|
||||
msgid "Set an admin username."
|
||||
msgstr ""
|
||||
|
||||
#: private/setup.php:31
|
||||
msgid "Set an admin password."
|
||||
msgstr ""
|
||||
|
||||
#: private/setup.php:195
|
||||
msgid ""
|
||||
"Your web server is not yet properly setup to allow files synchronization "
|
||||
"because the WebDAV interface seems to be broken."
|
||||
msgstr ""
|
||||
|
||||
#: private/setup.php:196
|
||||
#, php-format
|
||||
msgid "Please double check the <a href='%s'>installation guides</a>."
|
||||
msgstr ""
|
||||
|
||||
#: private/tags.php:194
|
||||
#, php-format
|
||||
msgid "Could not find category \"%s\""
|
||||
msgstr ""
|
||||
|
||||
#: private/template/functions.php:130
|
||||
msgid "seconds ago"
|
||||
msgstr ""
|
||||
|
||||
#: private/template/functions.php:131
|
||||
msgid "%n minute ago"
|
||||
msgid_plural "%n minutes ago"
|
||||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
msgstr[2] ""
|
||||
|
||||
#: private/template/functions.php:132
|
||||
msgid "%n hour ago"
|
||||
msgid_plural "%n hours ago"
|
||||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
msgstr[2] ""
|
||||
|
||||
#: private/template/functions.php:133
|
||||
msgid "today"
|
||||
msgstr ""
|
||||
|
||||
#: private/template/functions.php:134
|
||||
msgid "yesterday"
|
||||
msgstr ""
|
||||
|
||||
#: private/template/functions.php:136
|
||||
msgid "%n day go"
|
||||
msgid_plural "%n days ago"
|
||||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
msgstr[2] ""
|
||||
|
||||
#: private/template/functions.php:138
|
||||
msgid "last month"
|
||||
msgstr ""
|
||||
|
||||
#: private/template/functions.php:139
|
||||
msgid "%n month ago"
|
||||
msgid_plural "%n months ago"
|
||||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
msgstr[2] ""
|
||||
|
||||
#: private/template/functions.php:141
|
||||
msgid "last year"
|
||||
msgstr ""
|
||||
|
||||
#: private/template/functions.php:142
|
||||
msgid "years ago"
|
||||
msgstr ""
|
||||
|
||||
#: private/template.php:297 public/util.php:108
|
||||
msgid "Caused by:"
|
||||
msgstr ""
|
||||
@@ -1,657 +0,0 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
#
|
||||
# Translators:
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ownCloud\n"
|
||||
"Report-Msgid-Bugs-To: translations@owncloud.org\n"
|
||||
"POT-Creation-Date: 2013-11-27 12:08-0500\n"
|
||||
"PO-Revision-Date: 2013-11-27 17:09+0000\n"
|
||||
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
|
||||
"Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/owncloud/language/ru_RU/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: ru_RU\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||
|
||||
#: ajax/apps/ocs.php:20
|
||||
msgid "Unable to load list from App Store"
|
||||
msgstr ""
|
||||
|
||||
#: ajax/changedisplayname.php:25 ajax/removeuser.php:15 ajax/setquota.php:17
|
||||
#: ajax/togglegroups.php:20 changepassword/controller.php:55
|
||||
msgid "Authentication error"
|
||||
msgstr ""
|
||||
|
||||
#: ajax/changedisplayname.php:31
|
||||
msgid "Your full name has been changed."
|
||||
msgstr ""
|
||||
|
||||
#: ajax/changedisplayname.php:34
|
||||
msgid "Unable to change full name"
|
||||
msgstr ""
|
||||
|
||||
#: ajax/creategroup.php:10
|
||||
msgid "Group already exists"
|
||||
msgstr ""
|
||||
|
||||
#: ajax/creategroup.php:19
|
||||
msgid "Unable to add group"
|
||||
msgstr ""
|
||||
|
||||
#: ajax/lostpassword.php:12
|
||||
msgid "Email saved"
|
||||
msgstr ""
|
||||
|
||||
#: ajax/lostpassword.php:14
|
||||
msgid "Invalid email"
|
||||
msgstr ""
|
||||
|
||||
#: ajax/removegroup.php:13
|
||||
msgid "Unable to delete group"
|
||||
msgstr ""
|
||||
|
||||
#: ajax/removeuser.php:25
|
||||
msgid "Unable to delete user"
|
||||
msgstr ""
|
||||
|
||||
#: ajax/setlanguage.php:15
|
||||
msgid "Language changed"
|
||||
msgstr ""
|
||||
|
||||
#: ajax/setlanguage.php:17 ajax/setlanguage.php:20
|
||||
msgid "Invalid request"
|
||||
msgstr ""
|
||||
|
||||
#: ajax/togglegroups.php:12
|
||||
msgid "Admins can't remove themself from the admin group"
|
||||
msgstr ""
|
||||
|
||||
#: ajax/togglegroups.php:30
|
||||
#, php-format
|
||||
msgid "Unable to add user to group %s"
|
||||
msgstr ""
|
||||
|
||||
#: ajax/togglegroups.php:36
|
||||
#, php-format
|
||||
msgid "Unable to remove user from group %s"
|
||||
msgstr ""
|
||||
|
||||
#: ajax/updateapp.php:14
|
||||
msgid "Couldn't update app."
|
||||
msgstr ""
|
||||
|
||||
#: changepassword/controller.php:20
|
||||
msgid "Wrong password"
|
||||
msgstr ""
|
||||
|
||||
#: changepassword/controller.php:42
|
||||
msgid "No user supplied"
|
||||
msgstr ""
|
||||
|
||||
#: changepassword/controller.php:74
|
||||
msgid ""
|
||||
"Please provide an admin recovery password, otherwise all user data will be "
|
||||
"lost"
|
||||
msgstr ""
|
||||
|
||||
#: changepassword/controller.php:79
|
||||
msgid ""
|
||||
"Wrong admin recovery password. Please check the password and try again."
|
||||
msgstr ""
|
||||
|
||||
#: changepassword/controller.php:87
|
||||
msgid ""
|
||||
"Back-end doesn't support password change, but the users encryption key was "
|
||||
"successfully updated."
|
||||
msgstr ""
|
||||
|
||||
#: changepassword/controller.php:92 changepassword/controller.php:103
|
||||
msgid "Unable to change password"
|
||||
msgstr ""
|
||||
|
||||
#: js/apps.js:43
|
||||
msgid "Update to {appversion}"
|
||||
msgstr ""
|
||||
|
||||
#: js/apps.js:49 js/apps.js:82 js/apps.js:110
|
||||
msgid "Disable"
|
||||
msgstr ""
|
||||
|
||||
#: js/apps.js:49 js/apps.js:90 js/apps.js:103 js/apps.js:119
|
||||
msgid "Enable"
|
||||
msgstr ""
|
||||
|
||||
#: js/apps.js:71
|
||||
msgid "Please wait...."
|
||||
msgstr ""
|
||||
|
||||
#: js/apps.js:79 js/apps.js:80 js/apps.js:101
|
||||
msgid "Error while disabling app"
|
||||
msgstr ""
|
||||
|
||||
#: js/apps.js:100 js/apps.js:114 js/apps.js:115
|
||||
msgid "Error while enabling app"
|
||||
msgstr ""
|
||||
|
||||
#: js/apps.js:125
|
||||
msgid "Updating...."
|
||||
msgstr ""
|
||||
|
||||
#: js/apps.js:128
|
||||
msgid "Error while updating app"
|
||||
msgstr ""
|
||||
|
||||
#: js/apps.js:128
|
||||
msgid "Error"
|
||||
msgstr "Ошибка"
|
||||
|
||||
#: js/apps.js:129 templates/apps.php:43
|
||||
msgid "Update"
|
||||
msgstr ""
|
||||
|
||||
#: js/apps.js:132
|
||||
msgid "Updated"
|
||||
msgstr ""
|
||||
|
||||
#: js/personal.js:220
|
||||
msgid "Select a profile picture"
|
||||
msgstr ""
|
||||
|
||||
#: js/personal.js:266
|
||||
msgid "Decrypting files... Please wait, this can take some time."
|
||||
msgstr ""
|
||||
|
||||
#: js/personal.js:287
|
||||
msgid "Saving..."
|
||||
msgstr ""
|
||||
|
||||
#: js/users.js:47
|
||||
msgid "deleted"
|
||||
msgstr ""
|
||||
|
||||
#: js/users.js:47
|
||||
msgid "undo"
|
||||
msgstr ""
|
||||
|
||||
#: js/users.js:79
|
||||
msgid "Unable to remove user"
|
||||
msgstr ""
|
||||
|
||||
#: js/users.js:95 templates/users.php:26 templates/users.php:90
|
||||
#: templates/users.php:118
|
||||
msgid "Groups"
|
||||
msgstr ""
|
||||
|
||||
#: js/users.js:100 templates/users.php:92 templates/users.php:130
|
||||
msgid "Group Admin"
|
||||
msgstr ""
|
||||
|
||||
#: js/users.js:123 templates/users.php:170
|
||||
msgid "Delete"
|
||||
msgstr "Удалить"
|
||||
|
||||
#: js/users.js:284
|
||||
msgid "add group"
|
||||
msgstr ""
|
||||
|
||||
#: js/users.js:451
|
||||
msgid "A valid username must be provided"
|
||||
msgstr ""
|
||||
|
||||
#: js/users.js:452 js/users.js:458 js/users.js:473
|
||||
msgid "Error creating user"
|
||||
msgstr ""
|
||||
|
||||
#: js/users.js:457
|
||||
msgid "A valid password must be provided"
|
||||
msgstr ""
|
||||
|
||||
#: js/users.js:481
|
||||
msgid "Warning: Home directory for user \"{user}\" already exists"
|
||||
msgstr ""
|
||||
|
||||
#: personal.php:45 personal.php:46
|
||||
msgid "__language_name__"
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin.php:8
|
||||
msgid "Everything (fatal issues, errors, warnings, info, debug)"
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin.php:9
|
||||
msgid "Info, warnings, errors and fatal issues"
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin.php:10
|
||||
msgid "Warnings, errors and fatal issues"
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin.php:11
|
||||
msgid "Errors and fatal issues"
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin.php:12
|
||||
msgid "Fatal issues only"
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin.php:22 templates/admin.php:36
|
||||
msgid "Security Warning"
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin.php:25
|
||||
#, php-format
|
||||
msgid ""
|
||||
"You are accessing %s via HTTP. We strongly suggest you configure your server"
|
||||
" to require using HTTPS instead."
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin.php:39
|
||||
msgid ""
|
||||
"Your data directory and your files are probably accessible from the "
|
||||
"internet. The .htaccess file is not working. We strongly suggest that you "
|
||||
"configure your webserver in a way that the data directory is no longer "
|
||||
"accessible or you move the data directory outside the webserver document "
|
||||
"root."
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin.php:50
|
||||
msgid "Setup Warning"
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin.php:53
|
||||
msgid ""
|
||||
"Your web server is not yet properly setup to allow files synchronization "
|
||||
"because the WebDAV interface seems to be broken."
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin.php:54
|
||||
#, php-format
|
||||
msgid "Please double check the <a href=\"%s\">installation guides</a>."
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin.php:65
|
||||
msgid "Module 'fileinfo' missing"
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin.php:68
|
||||
msgid ""
|
||||
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this "
|
||||
"module to get best results with mime-type detection."
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin.php:79
|
||||
msgid "Locale not working"
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin.php:84
|
||||
msgid "System locale can not be set to a one which supports UTF-8."
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin.php:88
|
||||
msgid ""
|
||||
"This means that there might be problems with certain characters in file "
|
||||
"names."
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin.php:92
|
||||
#, php-format
|
||||
msgid ""
|
||||
"We strongly suggest to install the required packages on your system to "
|
||||
"support one of the following locales: %s."
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin.php:104
|
||||
msgid "Internet connection not working"
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin.php:107
|
||||
msgid ""
|
||||
"This server has no working internet connection. This means that some of the "
|
||||
"features like mounting of external storage, notifications about updates or "
|
||||
"installation of 3rd party apps don´t work. Accessing files from remote and "
|
||||
"sending of notification emails might also not work. We suggest to enable "
|
||||
"internet connection for this server if you want to have all features."
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin.php:121
|
||||
msgid "Cron"
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin.php:128
|
||||
msgid "Execute one task with each page loaded"
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin.php:136
|
||||
msgid ""
|
||||
"cron.php is registered at a webcron service to call cron.php every 15 "
|
||||
"minutes over http."
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin.php:144
|
||||
msgid "Use systems cron service to call the cron.php file every 15 minutes."
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin.php:149
|
||||
msgid "Sharing"
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin.php:155
|
||||
msgid "Enable Share API"
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin.php:156
|
||||
msgid "Allow apps to use the Share API"
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin.php:163
|
||||
msgid "Allow links"
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin.php:164
|
||||
msgid "Allow users to share items to the public with links"
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin.php:172
|
||||
msgid "Allow public uploads"
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin.php:173
|
||||
msgid ""
|
||||
"Allow users to enable others to upload into their publicly shared folders"
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin.php:181
|
||||
msgid "Allow resharing"
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin.php:182
|
||||
msgid "Allow users to share items shared with them again"
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin.php:189
|
||||
msgid "Allow users to share with anyone"
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin.php:192
|
||||
msgid "Allow users to only share with users in their groups"
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin.php:199
|
||||
msgid "Allow mail notification"
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin.php:200
|
||||
msgid "Allow user to send mail notification for shared files"
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin.php:207
|
||||
msgid "Security"
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin.php:220
|
||||
msgid "Enforce HTTPS"
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin.php:222
|
||||
#, php-format
|
||||
msgid "Forces the clients to connect to %s via an encrypted connection."
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin.php:228
|
||||
#, php-format
|
||||
msgid ""
|
||||
"Please connect to your %s via HTTPS to enable or disable the SSL "
|
||||
"enforcement."
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin.php:240
|
||||
msgid "Log"
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin.php:241
|
||||
msgid "Log level"
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin.php:273
|
||||
msgid "More"
|
||||
msgstr "Подробнее"
|
||||
|
||||
#: templates/admin.php:274
|
||||
msgid "Less"
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin.php:280 templates/personal.php:173
|
||||
msgid "Version"
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin.php:284 templates/personal.php:176
|
||||
msgid ""
|
||||
"Developed by the <a href=\"http://ownCloud.org/contact\" "
|
||||
"target=\"_blank\">ownCloud community</a>, the <a "
|
||||
"href=\"https://github.com/owncloud\" target=\"_blank\">source code</a> is "
|
||||
"licensed under the <a href=\"http://www.gnu.org/licenses/agpl-3.0.html\" "
|
||||
"target=\"_blank\"><abbr title=\"Affero General Public "
|
||||
"License\">AGPL</abbr></a>."
|
||||
msgstr ""
|
||||
|
||||
#: templates/apps.php:13
|
||||
msgid "Add your App"
|
||||
msgstr ""
|
||||
|
||||
#: templates/apps.php:28
|
||||
msgid "More Apps"
|
||||
msgstr ""
|
||||
|
||||
#: templates/apps.php:33
|
||||
msgid "Select an App"
|
||||
msgstr ""
|
||||
|
||||
#: templates/apps.php:39
|
||||
msgid "See application page at apps.owncloud.com"
|
||||
msgstr ""
|
||||
|
||||
#: templates/apps.php:41
|
||||
msgid "<span class=\"licence\"></span>-licensed by <span class=\"author\"></span>"
|
||||
msgstr ""
|
||||
|
||||
#: templates/help.php:4
|
||||
msgid "User Documentation"
|
||||
msgstr ""
|
||||
|
||||
#: templates/help.php:6
|
||||
msgid "Administrator Documentation"
|
||||
msgstr ""
|
||||
|
||||
#: templates/help.php:9
|
||||
msgid "Online Documentation"
|
||||
msgstr ""
|
||||
|
||||
#: templates/help.php:11
|
||||
msgid "Forum"
|
||||
msgstr ""
|
||||
|
||||
#: templates/help.php:14
|
||||
msgid "Bugtracker"
|
||||
msgstr ""
|
||||
|
||||
#: templates/help.php:17
|
||||
msgid "Commercial Support"
|
||||
msgstr ""
|
||||
|
||||
#: templates/personal.php:8
|
||||
msgid "Get the apps to sync your files"
|
||||
msgstr ""
|
||||
|
||||
#: templates/personal.php:19
|
||||
msgid "Show First Run Wizard again"
|
||||
msgstr ""
|
||||
|
||||
#: templates/personal.php:27
|
||||
#, php-format
|
||||
msgid "You have used <strong>%s</strong> of the available <strong>%s</strong>"
|
||||
msgstr ""
|
||||
|
||||
#: templates/personal.php:39 templates/users.php:23 templates/users.php:89
|
||||
msgid "Password"
|
||||
msgstr "Пароль"
|
||||
|
||||
#: templates/personal.php:40
|
||||
msgid "Your password was changed"
|
||||
msgstr ""
|
||||
|
||||
#: templates/personal.php:41
|
||||
msgid "Unable to change your password"
|
||||
msgstr ""
|
||||
|
||||
#: templates/personal.php:42
|
||||
msgid "Current password"
|
||||
msgstr ""
|
||||
|
||||
#: templates/personal.php:44
|
||||
msgid "New password"
|
||||
msgstr ""
|
||||
|
||||
#: templates/personal.php:46
|
||||
msgid "Change password"
|
||||
msgstr ""
|
||||
|
||||
#: templates/personal.php:58 templates/users.php:88
|
||||
msgid "Full Name"
|
||||
msgstr ""
|
||||
|
||||
#: templates/personal.php:73
|
||||
msgid "Email"
|
||||
msgstr ""
|
||||
|
||||
#: templates/personal.php:75
|
||||
msgid "Your email address"
|
||||
msgstr ""
|
||||
|
||||
#: templates/personal.php:76
|
||||
msgid "Fill in an email address to enable password recovery"
|
||||
msgstr ""
|
||||
|
||||
#: templates/personal.php:86
|
||||
msgid "Profile picture"
|
||||
msgstr ""
|
||||
|
||||
#: templates/personal.php:91
|
||||
msgid "Upload new"
|
||||
msgstr ""
|
||||
|
||||
#: templates/personal.php:93
|
||||
msgid "Select new from Files"
|
||||
msgstr ""
|
||||
|
||||
#: templates/personal.php:94
|
||||
msgid "Remove image"
|
||||
msgstr ""
|
||||
|
||||
#: templates/personal.php:95
|
||||
msgid "Either png or jpg. Ideally square but you will be able to crop it."
|
||||
msgstr ""
|
||||
|
||||
#: templates/personal.php:97
|
||||
msgid "Your avatar is provided by your original account."
|
||||
msgstr ""
|
||||
|
||||
#: templates/personal.php:101
|
||||
msgid "Abort"
|
||||
msgstr ""
|
||||
|
||||
#: templates/personal.php:102
|
||||
msgid "Choose as profile image"
|
||||
msgstr ""
|
||||
|
||||
#: templates/personal.php:110 templates/personal.php:111
|
||||
msgid "Language"
|
||||
msgstr ""
|
||||
|
||||
#: templates/personal.php:130
|
||||
msgid "Help translate"
|
||||
msgstr ""
|
||||
|
||||
#: templates/personal.php:137
|
||||
msgid "WebDAV"
|
||||
msgstr ""
|
||||
|
||||
#: templates/personal.php:139
|
||||
#, php-format
|
||||
msgid ""
|
||||
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via "
|
||||
"WebDAV</a>"
|
||||
msgstr ""
|
||||
|
||||
#: templates/personal.php:150
|
||||
msgid "Encryption"
|
||||
msgstr ""
|
||||
|
||||
#: templates/personal.php:152
|
||||
msgid "The encryption app is no longer enabled, please decrypt all your files"
|
||||
msgstr ""
|
||||
|
||||
#: templates/personal.php:158
|
||||
msgid "Log-in password"
|
||||
msgstr ""
|
||||
|
||||
#: templates/personal.php:163
|
||||
msgid "Decrypt all Files"
|
||||
msgstr ""
|
||||
|
||||
#: templates/users.php:21
|
||||
msgid "Login Name"
|
||||
msgstr ""
|
||||
|
||||
#: templates/users.php:30
|
||||
msgid "Create"
|
||||
msgstr "Создать"
|
||||
|
||||
#: templates/users.php:36
|
||||
msgid "Admin Recovery Password"
|
||||
msgstr ""
|
||||
|
||||
#: templates/users.php:37 templates/users.php:38
|
||||
msgid ""
|
||||
"Enter the recovery password in order to recover the users files during "
|
||||
"password change"
|
||||
msgstr ""
|
||||
|
||||
#: templates/users.php:42
|
||||
msgid "Default Storage"
|
||||
msgstr ""
|
||||
|
||||
#: templates/users.php:44 templates/users.php:139
|
||||
msgid "Please enter storage quota (ex: \"512 MB\" or \"12 GB\")"
|
||||
msgstr ""
|
||||
|
||||
#: templates/users.php:48 templates/users.php:148
|
||||
msgid "Unlimited"
|
||||
msgstr ""
|
||||
|
||||
#: templates/users.php:66 templates/users.php:163
|
||||
msgid "Other"
|
||||
msgstr ""
|
||||
|
||||
#: templates/users.php:87
|
||||
msgid "Username"
|
||||
msgstr "Имя пользователя"
|
||||
|
||||
#: templates/users.php:94
|
||||
msgid "Storage"
|
||||
msgstr ""
|
||||
|
||||
#: templates/users.php:108
|
||||
msgid "change full name"
|
||||
msgstr ""
|
||||
|
||||
#: templates/users.php:112
|
||||
msgid "set new password"
|
||||
msgstr ""
|
||||
|
||||
#: templates/users.php:143
|
||||
msgid "Default"
|
||||
msgstr ""
|
||||
@@ -1,515 +0,0 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
#
|
||||
# Translators:
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ownCloud\n"
|
||||
"Report-Msgid-Bugs-To: translations@owncloud.org\n"
|
||||
"POT-Creation-Date: 2013-11-27 12:08-0500\n"
|
||||
"PO-Revision-Date: 2013-11-27 17:09+0000\n"
|
||||
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
|
||||
"Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/owncloud/language/ru_RU/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: ru_RU\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||
|
||||
#: ajax/clearMappings.php:34
|
||||
msgid "Failed to clear the mappings."
|
||||
msgstr ""
|
||||
|
||||
#: ajax/deleteConfiguration.php:34
|
||||
msgid "Failed to delete the server configuration"
|
||||
msgstr ""
|
||||
|
||||
#: ajax/testConfiguration.php:37
|
||||
msgid "The configuration is valid and the connection could be established!"
|
||||
msgstr ""
|
||||
|
||||
#: ajax/testConfiguration.php:40
|
||||
msgid ""
|
||||
"The configuration is valid, but the Bind failed. Please check the server "
|
||||
"settings and credentials."
|
||||
msgstr ""
|
||||
|
||||
#: ajax/testConfiguration.php:44
|
||||
msgid ""
|
||||
"The configuration is invalid. Please have a look at the logs for further "
|
||||
"details."
|
||||
msgstr ""
|
||||
|
||||
#: ajax/wizard.php:32
|
||||
msgid "No action specified"
|
||||
msgstr ""
|
||||
|
||||
#: ajax/wizard.php:38
|
||||
msgid "No configuration specified"
|
||||
msgstr ""
|
||||
|
||||
#: ajax/wizard.php:81
|
||||
msgid "No data specified"
|
||||
msgstr ""
|
||||
|
||||
#: ajax/wizard.php:89
|
||||
#, php-format
|
||||
msgid " Could not set configuration %s"
|
||||
msgstr ""
|
||||
|
||||
#: js/settings.js:67
|
||||
msgid "Deletion failed"
|
||||
msgstr ""
|
||||
|
||||
#: js/settings.js:83
|
||||
msgid "Take over settings from recent server configuration?"
|
||||
msgstr ""
|
||||
|
||||
#: js/settings.js:84
|
||||
msgid "Keep settings?"
|
||||
msgstr ""
|
||||
|
||||
#: js/settings.js:99
|
||||
msgid "Cannot add server configuration"
|
||||
msgstr ""
|
||||
|
||||
#: js/settings.js:127
|
||||
msgid "mappings cleared"
|
||||
msgstr ""
|
||||
|
||||
#: js/settings.js:128
|
||||
msgid "Success"
|
||||
msgstr ""
|
||||
|
||||
#: js/settings.js:133
|
||||
msgid "Error"
|
||||
msgstr "Ошибка"
|
||||
|
||||
#: js/settings.js:777
|
||||
msgid "Configuration OK"
|
||||
msgstr ""
|
||||
|
||||
#: js/settings.js:786
|
||||
msgid "Configuration incorrect"
|
||||
msgstr ""
|
||||
|
||||
#: js/settings.js:795
|
||||
msgid "Configuration incomplete"
|
||||
msgstr ""
|
||||
|
||||
#: js/settings.js:812 js/settings.js:821
|
||||
msgid "Select groups"
|
||||
msgstr "Выбрать группы"
|
||||
|
||||
#: js/settings.js:815 js/settings.js:824
|
||||
msgid "Select object classes"
|
||||
msgstr ""
|
||||
|
||||
#: js/settings.js:818
|
||||
msgid "Select attributes"
|
||||
msgstr ""
|
||||
|
||||
#: js/settings.js:845
|
||||
msgid "Connection test succeeded"
|
||||
msgstr ""
|
||||
|
||||
#: js/settings.js:852
|
||||
msgid "Connection test failed"
|
||||
msgstr ""
|
||||
|
||||
#: js/settings.js:861
|
||||
msgid "Do you really want to delete the current Server Configuration?"
|
||||
msgstr ""
|
||||
|
||||
#: js/settings.js:862
|
||||
msgid "Confirm Deletion"
|
||||
msgstr ""
|
||||
|
||||
#: lib/wizard.php:79 lib/wizard.php:93
|
||||
#, php-format
|
||||
msgid "%s group found"
|
||||
msgid_plural "%s groups found"
|
||||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
msgstr[2] ""
|
||||
|
||||
#: lib/wizard.php:122
|
||||
#, php-format
|
||||
msgid "%s user found"
|
||||
msgid_plural "%s users found"
|
||||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
msgstr[2] ""
|
||||
|
||||
#: lib/wizard.php:779 lib/wizard.php:791
|
||||
msgid "Invalid Host"
|
||||
msgstr ""
|
||||
|
||||
#: lib/wizard.php:952
|
||||
msgid "Could not find the desired feature"
|
||||
msgstr ""
|
||||
|
||||
#: templates/part.settingcontrols.php:2
|
||||
msgid "Save"
|
||||
msgstr "Сохранить"
|
||||
|
||||
#: templates/part.settingcontrols.php:4
|
||||
msgid "Test Configuration"
|
||||
msgstr ""
|
||||
|
||||
#: templates/part.settingcontrols.php:10 templates/part.wizardcontrols.php:14
|
||||
msgid "Help"
|
||||
msgstr "Помощь"
|
||||
|
||||
#: templates/part.wizard-groupfilter.php:4
|
||||
#, php-format
|
||||
msgid "Limit the access to %s to groups meeting this criteria:"
|
||||
msgstr ""
|
||||
|
||||
#: templates/part.wizard-groupfilter.php:8
|
||||
#: templates/part.wizard-userfilter.php:8
|
||||
msgid "only those object classes:"
|
||||
msgstr ""
|
||||
|
||||
#: templates/part.wizard-groupfilter.php:17
|
||||
#: templates/part.wizard-userfilter.php:17
|
||||
msgid "only from those groups:"
|
||||
msgstr ""
|
||||
|
||||
#: templates/part.wizard-groupfilter.php:25
|
||||
#: templates/part.wizard-loginfilter.php:32
|
||||
#: templates/part.wizard-userfilter.php:25
|
||||
msgid "Edit raw filter instead"
|
||||
msgstr ""
|
||||
|
||||
#: templates/part.wizard-groupfilter.php:30
|
||||
#: templates/part.wizard-loginfilter.php:37
|
||||
#: templates/part.wizard-userfilter.php:30
|
||||
msgid "Raw LDAP filter"
|
||||
msgstr ""
|
||||
|
||||
#: templates/part.wizard-groupfilter.php:31
|
||||
#, php-format
|
||||
msgid ""
|
||||
"The filter specifies which LDAP groups shall have access to the %s instance."
|
||||
msgstr ""
|
||||
|
||||
#: templates/part.wizard-groupfilter.php:38
|
||||
msgid "groups found"
|
||||
msgstr ""
|
||||
|
||||
#: templates/part.wizard-loginfilter.php:4
|
||||
msgid "What attribute shall be used as login name:"
|
||||
msgstr ""
|
||||
|
||||
#: templates/part.wizard-loginfilter.php:8
|
||||
msgid "LDAP Username:"
|
||||
msgstr ""
|
||||
|
||||
#: templates/part.wizard-loginfilter.php:16
|
||||
msgid "LDAP Email Address:"
|
||||
msgstr ""
|
||||
|
||||
#: templates/part.wizard-loginfilter.php:24
|
||||
msgid "Other Attributes:"
|
||||
msgstr ""
|
||||
|
||||
#: templates/part.wizard-loginfilter.php:38
|
||||
#, php-format
|
||||
msgid ""
|
||||
"Defines the filter to apply, when login is attempted. %%uid replaces the "
|
||||
"username in the login action. Example: \"uid=%%uid\""
|
||||
msgstr ""
|
||||
|
||||
#: templates/part.wizard-server.php:18
|
||||
msgid "Add Server Configuration"
|
||||
msgstr ""
|
||||
|
||||
#: templates/part.wizard-server.php:30
|
||||
msgid "Host"
|
||||
msgstr ""
|
||||
|
||||
#: templates/part.wizard-server.php:31
|
||||
msgid ""
|
||||
"You can omit the protocol, except you require SSL. Then start with ldaps://"
|
||||
msgstr ""
|
||||
|
||||
#: templates/part.wizard-server.php:36
|
||||
msgid "Port"
|
||||
msgstr ""
|
||||
|
||||
#: templates/part.wizard-server.php:44
|
||||
msgid "User DN"
|
||||
msgstr ""
|
||||
|
||||
#: templates/part.wizard-server.php:45
|
||||
msgid ""
|
||||
"The DN of the client user with which the bind shall be done, e.g. "
|
||||
"uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password "
|
||||
"empty."
|
||||
msgstr ""
|
||||
|
||||
#: templates/part.wizard-server.php:52
|
||||
msgid "Password"
|
||||
msgstr "Пароль"
|
||||
|
||||
#: templates/part.wizard-server.php:53
|
||||
msgid "For anonymous access, leave DN and Password empty."
|
||||
msgstr ""
|
||||
|
||||
#: templates/part.wizard-server.php:60
|
||||
msgid "One Base DN per line"
|
||||
msgstr ""
|
||||
|
||||
#: templates/part.wizard-server.php:61
|
||||
msgid "You can specify Base DN for users and groups in the Advanced tab"
|
||||
msgstr ""
|
||||
|
||||
#: templates/part.wizard-userfilter.php:4
|
||||
#, php-format
|
||||
msgid "Limit the access to %s to users meeting this criteria:"
|
||||
msgstr ""
|
||||
|
||||
#: templates/part.wizard-userfilter.php:31
|
||||
#, php-format
|
||||
msgid ""
|
||||
"The filter specifies which LDAP users shall have access to the %s instance."
|
||||
msgstr ""
|
||||
|
||||
#: templates/part.wizard-userfilter.php:38
|
||||
msgid "users found"
|
||||
msgstr ""
|
||||
|
||||
#: templates/part.wizardcontrols.php:5
|
||||
msgid "Back"
|
||||
msgstr "Назад"
|
||||
|
||||
#: templates/part.wizardcontrols.php:8
|
||||
msgid "Continue"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:11
|
||||
msgid ""
|
||||
"<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."
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:14
|
||||
msgid ""
|
||||
"<b>Warning:</b> The PHP LDAP module is not installed, the backend will not "
|
||||
"work. Please ask your system administrator to install it."
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:20
|
||||
msgid "Connection Settings"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:22
|
||||
msgid "Configuration Active"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:22
|
||||
msgid "When unchecked, this configuration will be skipped."
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:23
|
||||
msgid "Backup (Replica) Host"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:23
|
||||
msgid ""
|
||||
"Give an optional backup host. It must be a replica of the main LDAP/AD "
|
||||
"server."
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:24
|
||||
msgid "Backup (Replica) Port"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:25
|
||||
msgid "Disable Main Server"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:25
|
||||
msgid "Only connect to the replica server."
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:26
|
||||
msgid "Case insensitve LDAP server (Windows)"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:27
|
||||
msgid "Turn off SSL certificate validation."
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:27
|
||||
#, php-format
|
||||
msgid ""
|
||||
"Not recommended, use it for testing only! If connection only works with this"
|
||||
" option, import the LDAP server's SSL certificate in your %s server."
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:28
|
||||
msgid "Cache Time-To-Live"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:28
|
||||
msgid "in seconds. A change empties the cache."
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:30
|
||||
msgid "Directory Settings"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:32
|
||||
msgid "User Display Name Field"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:32
|
||||
msgid "The LDAP attribute to use to generate the user's display name."
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:33
|
||||
msgid "Base User Tree"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:33
|
||||
msgid "One User Base DN per line"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:34
|
||||
msgid "User Search Attributes"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:34 templates/settings.php:37
|
||||
msgid "Optional; one attribute per line"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:35
|
||||
msgid "Group Display Name Field"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:35
|
||||
msgid "The LDAP attribute to use to generate the groups's display name."
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:36
|
||||
msgid "Base Group Tree"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:36
|
||||
msgid "One Group Base DN per line"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:37
|
||||
msgid "Group Search Attributes"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:38
|
||||
msgid "Group-Member association"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:40
|
||||
msgid "Special Attributes"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:42
|
||||
msgid "Quota Field"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:43
|
||||
msgid "Quota Default"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:43
|
||||
msgid "in bytes"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:44
|
||||
msgid "Email Field"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:45
|
||||
msgid "User Home Folder Naming Rule"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:45
|
||||
msgid ""
|
||||
"Leave empty for user name (default). Otherwise, specify an LDAP/AD "
|
||||
"attribute."
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:51
|
||||
msgid "Internal Username"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:52
|
||||
msgid ""
|
||||
"By default the internal username will be created from the UUID attribute. It"
|
||||
" makes sure that the username is unique and characters do not need to be "
|
||||
"converted. The internal username has the restriction that only these "
|
||||
"characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced "
|
||||
"with their ASCII correspondence or simply omitted. On collisions a number "
|
||||
"will be added/increased. The internal username is used to identify a user "
|
||||
"internally. It is also the default name for the user home folder. It is also"
|
||||
" a part of remote URLs, for instance for all *DAV services. With this "
|
||||
"setting, the default behavior can be overridden. To achieve a similar "
|
||||
"behavior as before ownCloud 5 enter the user display name attribute in the "
|
||||
"following field. Leave it empty for default behavior. Changes will have "
|
||||
"effect only on newly mapped (added) LDAP users."
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:53
|
||||
msgid "Internal Username Attribute:"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:54
|
||||
msgid "Override UUID detection"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:55
|
||||
msgid ""
|
||||
"By default, the UUID attribute is automatically detected. The UUID attribute"
|
||||
" is used to doubtlessly identify LDAP users and groups. Also, the internal "
|
||||
"username will be created based on the UUID, if not specified otherwise "
|
||||
"above. You can override the setting and pass an attribute of your choice. "
|
||||
"You must make sure that the attribute of your choice can be fetched for both"
|
||||
" users and groups and it is unique. Leave it empty for default behavior. "
|
||||
"Changes will have effect only on newly mapped (added) LDAP users and groups."
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:56
|
||||
msgid "UUID Attribute for Users:"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:57
|
||||
msgid "UUID Attribute for Groups:"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:58
|
||||
msgid "Username-LDAP User Mapping"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:59
|
||||
msgid ""
|
||||
"Usernames are used to store and assign (meta) data. In order to precisely "
|
||||
"identify and recognize users, each LDAP user will have a internal username. "
|
||||
"This requires a mapping from username to LDAP user. The created username is "
|
||||
"mapped to the UUID of the LDAP user. Additionally the DN is cached as well "
|
||||
"to reduce LDAP interaction, but it is not used for identification. If the DN"
|
||||
" changes, the changes will be found. The internal username is used all over."
|
||||
" Clearing the mappings will have leftovers everywhere. Clearing the mappings"
|
||||
" is not configuration sensitive, it affects all LDAP configurations! Never "
|
||||
"clear the mappings in a production environment, only in a testing or "
|
||||
"experimental stage."
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:60
|
||||
msgid "Clear Username-LDAP User Mapping"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:60
|
||||
msgid "Clear Groupname-LDAP Group Mapping"
|
||||
msgstr ""
|
||||
@@ -1,36 +0,0 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
#
|
||||
# Translators:
|
||||
# AnnaSch <cdewqazxsqwe@gmail.com>, 2013
|
||||
# AnnaSch <cdewqazxsqwe@gmail.com>, 2012
|
||||
# skoptev <skoptev@ukr.net>, 2012
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ownCloud\n"
|
||||
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
|
||||
"POT-Creation-Date: 2013-10-19 08:26-0400\n"
|
||||
"PO-Revision-Date: 2013-10-18 09:15+0000\n"
|
||||
"Last-Translator: masensio <masensio@solidgear.es>\n"
|
||||
"Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/owncloud/language/ru_RU/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: ru_RU\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||
|
||||
#: templates/settings.php:3
|
||||
msgid "WebDAV Authentication"
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:4
|
||||
msgid "Address: "
|
||||
msgstr ""
|
||||
|
||||
#: templates/settings.php:7
|
||||
msgid ""
|
||||
"The user credentials will be sent to this address. This plugin checks the "
|
||||
"response and will interpret the HTTP statuscodes 401 and 403 as invalid "
|
||||
"credentials, and all other responses as valid credentials."
|
||||
msgstr ""
|
||||
+50
-49
@@ -131,8 +131,8 @@ class OC {
|
||||
OC::$THIRDPARTYROOT = rtrim(dirname(OC::$SERVERROOT), '/');
|
||||
} else {
|
||||
throw new Exception('3rdparty directory not found! Please put the ownCloud 3rdparty'
|
||||
.' folder in the ownCloud folder or the folder above.'
|
||||
.' You can also configure the location in the config.php file.');
|
||||
. ' folder in the ownCloud folder or the folder above.'
|
||||
. ' You can also configure the location in the config.php file.');
|
||||
}
|
||||
// search the apps folder
|
||||
$config_paths = OC_Config::getValue('apps_paths', array());
|
||||
@@ -156,7 +156,7 @@ class OC {
|
||||
|
||||
if (empty(OC::$APPSROOTS)) {
|
||||
throw new Exception('apps directory not found! Please put the ownCloud apps folder in the ownCloud folder'
|
||||
.' or the folder above. You can also configure the location in the config.php file.');
|
||||
. ' or the folder above. You can also configure the location in the config.php file.');
|
||||
}
|
||||
$paths = array();
|
||||
foreach (OC::$APPSROOTS as $path) {
|
||||
@@ -176,7 +176,8 @@ class OC {
|
||||
|
||||
public static function checkConfig() {
|
||||
if (file_exists(OC::$SERVERROOT . "/config/config.php")
|
||||
and !is_writable(OC::$SERVERROOT . "/config/config.php")) {
|
||||
and !is_writable(OC::$SERVERROOT . "/config/config.php")
|
||||
) {
|
||||
$defaults = new OC_Defaults();
|
||||
if (self::$CLI) {
|
||||
echo "Can't write into config directory!\n";
|
||||
@@ -188,7 +189,7 @@ class OC {
|
||||
OC_Template::printErrorPage(
|
||||
"Can't write into config directory!",
|
||||
'This can usually be fixed by '
|
||||
.'<a href="' . \OC_Helper::linkToDocs('admin-dir_permissions') . '" target="_blank">giving the webserver write access to the config directory</a>.'
|
||||
. '<a href="' . \OC_Helper::linkToDocs('admin-dir_permissions') . '" target="_blank">giving the webserver write access to the config directory</a>.'
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -254,30 +255,42 @@ class OC {
|
||||
}
|
||||
}
|
||||
|
||||
public static function checkUpgrade($showTemplate = true) {
|
||||
/**
|
||||
* check if the instance needs to preform an upgrade
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function needUpgrade() {
|
||||
if (OC_Config::getValue('installed', false)) {
|
||||
$installedVersion = OC_Config::getValue('version', '0.0.0');
|
||||
$currentVersion = implode('.', OC_Util::getVersion());
|
||||
if (version_compare($currentVersion, $installedVersion, '>')) {
|
||||
if ($showTemplate && !OC_Config::getValue('maintenance', false)) {
|
||||
OC_Config::setValue('theme', '');
|
||||
$minimizerCSS = new OC_Minimizer_CSS();
|
||||
$minimizerCSS->clearCache();
|
||||
$minimizerJS = new OC_Minimizer_JS();
|
||||
$minimizerJS->clearCache();
|
||||
OC_Util::addScript('update');
|
||||
$tmpl = new OC_Template('', 'update.admin', 'guest');
|
||||
$tmpl->assign('version', OC_Util::getVersionString());
|
||||
$tmpl->printPage();
|
||||
exit();
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return version_compare($currentVersion, $installedVersion, '>');
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public static function checkUpgrade($showTemplate = true) {
|
||||
if (self::needUpgrade()) {
|
||||
if ($showTemplate && !OC_Config::getValue('maintenance', false)) {
|
||||
OC_Config::setValue('theme', '');
|
||||
$minimizerCSS = new OC_Minimizer_CSS();
|
||||
$minimizerCSS->clearCache();
|
||||
$minimizerJS = new OC_Minimizer_JS();
|
||||
$minimizerJS->clearCache();
|
||||
OC_Util::addScript('config'); // needed for web root
|
||||
OC_Util::addScript('update');
|
||||
$tmpl = new OC_Template('', 'update.admin', 'guest');
|
||||
$tmpl->assign('version', OC_Util::getVersionString());
|
||||
$tmpl->printPage();
|
||||
exit();
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static function initTemplateEngine() {
|
||||
// Add the stuff we need always
|
||||
OC_Util::addScript("jquery-1.10.0.min");
|
||||
@@ -461,7 +474,7 @@ class OC {
|
||||
// OC_Util::getInstanceId() for namespacing. See #5409.
|
||||
try {
|
||||
self::$loader->setMemoryCache(\OC\Memcache\Factory::createLowLatency('Autoloader'));
|
||||
} catch(\Exception $ex) {
|
||||
} catch (\Exception $ex) {
|
||||
}
|
||||
}
|
||||
OC_Util::isSetLocaleWorking();
|
||||
@@ -506,7 +519,7 @@ class OC {
|
||||
if (count($errors) > 0) {
|
||||
if (self::$CLI) {
|
||||
foreach ($errors as $error) {
|
||||
echo $error['error']."\n";
|
||||
echo $error['error'] . "\n";
|
||||
echo $error['hint'] . "\n\n";
|
||||
}
|
||||
} else {
|
||||
@@ -527,12 +540,12 @@ class OC {
|
||||
OC_User::useBackend(new OC_User_Database());
|
||||
OC_Group::useBackend(new OC_Group_Database());
|
||||
|
||||
if (isset($_SERVER['PHP_AUTH_USER']) && self::$session->exists('user_id')
|
||||
&& $_SERVER['PHP_AUTH_USER'] != self::$session->get('user_id')) {
|
||||
$sessionUser = self::$session->get('user_id');
|
||||
if (isset($_SERVER['PHP_AUTH_USER']) && self::$session->exists('loginname')
|
||||
&& $_SERVER['PHP_AUTH_USER'] !== self::$session->get('loginname')) {
|
||||
$sessionUser = self::$session->get('loginname');
|
||||
$serverUser = $_SERVER['PHP_AUTH_USER'];
|
||||
OC_Log::write('core',
|
||||
"Session user-id ($sessionUser) doesn't match SERVER[PHP_AUTH_USER] ($serverUser).",
|
||||
"Session loginname ($sessionUser) doesn't match SERVER[PHP_AUTH_USER] ($serverUser).",
|
||||
OC_Log::WARN);
|
||||
OC_User::logout();
|
||||
}
|
||||
@@ -601,13 +614,9 @@ class OC {
|
||||
* register hooks for the cache
|
||||
*/
|
||||
public static function registerCacheHooks() {
|
||||
if (OC_Config::getValue('installed', false)) { //don't try to do this before we are properly setup
|
||||
// register cache cleanup jobs
|
||||
try { //if this is executed before the upgrade to the new backgroundjob system is completed it will throw an exception
|
||||
\OCP\BackgroundJob::registerJob('OC\Cache\FileGlobalGC');
|
||||
} catch (Exception $e) {
|
||||
if (OC_Config::getValue('installed', false) && !self::needUpgrade()) { //don't try to do this before we are properly setup
|
||||
\OCP\BackgroundJob::registerJob('OC\Cache\FileGlobalGC');
|
||||
|
||||
}
|
||||
// NOTE: This will be replaced to use OCP
|
||||
$userSession = \OC_User::getUserSession();
|
||||
$userSession->listen('postLogin', '\OC\Cache\File', 'loginListener');
|
||||
@@ -618,14 +627,9 @@ class OC {
|
||||
* register hooks for the cache
|
||||
*/
|
||||
public static function registerLogRotate() {
|
||||
if (OC_Config::getValue('installed', false) && OC_Config::getValue('log_rotate_size', false)) {
|
||||
if (OC_Config::getValue('installed', false) && OC_Config::getValue('log_rotate_size', false) && !self::needUpgrade()) {
|
||||
//don't try to do this before we are properly setup
|
||||
// register cache cleanup jobs
|
||||
try { //if this is executed before the upgrade to the new backgroundjob system is completed it will throw an exception
|
||||
\OCP\BackgroundJob::registerJob('OC\Log\Rotate', OC_Config::getValue("datadirectory", OC::$SERVERROOT.'/data').'/owncloud.log');
|
||||
} catch (Exception $e) {
|
||||
|
||||
}
|
||||
\OCP\BackgroundJob::registerJob('OC\Log\Rotate', OC_Config::getValue("datadirectory", OC::$SERVERROOT . '/data') . '/owncloud.log');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -652,7 +656,7 @@ class OC {
|
||||
* register hooks for sharing
|
||||
*/
|
||||
public static function registerShareHooks() {
|
||||
if(\OC_Config::getValue('installed')) {
|
||||
if (\OC_Config::getValue('installed')) {
|
||||
OC_Hook::connect('OC_User', 'post_deleteUser', 'OCP\Share', 'post_deleteUser');
|
||||
OC_Hook::connect('OC_User', 'post_addToGroup', 'OCP\Share', 'post_addToGroup');
|
||||
OC_Hook::connect('OC_User', 'post_removeFromGroup', 'OCP\Share', 'post_removeFromGroup');
|
||||
@@ -675,7 +679,7 @@ class OC {
|
||||
}
|
||||
|
||||
$request = OC_Request::getPathInfo();
|
||||
if(substr($request, -3) !== '.js') {// we need these files during the upgrade
|
||||
if (substr($request, -3) !== '.js') { // we need these files during the upgrade
|
||||
self::checkMaintenanceMode();
|
||||
self::checkUpgrade();
|
||||
}
|
||||
@@ -793,18 +797,16 @@ class OC {
|
||||
// auth possible via apache module?
|
||||
if (OC::tryApacheAuth()) {
|
||||
$error[] = 'apacheauthfailed';
|
||||
}
|
||||
// remember was checked after last login
|
||||
} // remember was checked after last login
|
||||
elseif (OC::tryRememberLogin()) {
|
||||
$error[] = 'invalidcookie';
|
||||
}
|
||||
// logon via web form
|
||||
} // logon via web form
|
||||
elseif (OC::tryFormLogin()) {
|
||||
$error[] = 'invalidpassword';
|
||||
if ( OC_Config::getValue('log_authfailip', false) ) {
|
||||
OC_Log::write('core', 'Login failed: user \''.$_POST["user"].'\' , wrong password, IP:'.$_SERVER['REMOTE_ADDR'],
|
||||
OC_Log::WARN);
|
||||
} else {
|
||||
} else {
|
||||
OC_Log::write('core', 'Login failed: user \''.$_POST["user"].'\' , wrong password, IP:set log_authfailip=true in conf',
|
||||
OC_Log::WARN);
|
||||
}
|
||||
@@ -866,7 +868,6 @@ class OC {
|
||||
OC_User::setMagicInCookie($_COOKIE['oc_username'], $token);
|
||||
// login
|
||||
OC_User::setUserId($_COOKIE['oc_username']);
|
||||
OC_User::setDisplayName($_COOKIE['oc_username'], $_COOKIE['display_name']);
|
||||
OC_Util::redirectToDefaultPage();
|
||||
// doesn't return
|
||||
}
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
<?php
|
||||
$TRANSLATIONS = array(
|
||||
"Help" => "Помощь",
|
||||
"Settings" => "Настройки",
|
||||
"Files" => "Файлы",
|
||||
"Text" => "Текст",
|
||||
"_%n minute ago_::_%n minutes ago_" => array("","",""),
|
||||
"_%n hour ago_::_%n hours ago_" => array("","",""),
|
||||
"_%n day go_::_%n days ago_" => array("","",""),
|
||||
"_%n month ago_::_%n months ago_" => array("","","")
|
||||
);
|
||||
$PLURAL_FORMS = "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);";
|
||||
@@ -4,7 +4,7 @@
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OC;
|
||||
@@ -15,6 +15,7 @@ namespace OC;
|
||||
class AllConfig implements \OCP\IConfig {
|
||||
/**
|
||||
* Sets a new system wide value
|
||||
*
|
||||
* @param string $key the key of the value, under which will be saved
|
||||
* @param string $value the value that should be stored
|
||||
* @todo need a use case for this
|
||||
@@ -25,16 +26,19 @@ class AllConfig implements \OCP\IConfig {
|
||||
|
||||
/**
|
||||
* Looks up a system wide defined value
|
||||
*
|
||||
* @param string $key the key of the value, under which it was saved
|
||||
* @param string $default the default value to be returned if the value isn't set
|
||||
* @return string the saved value
|
||||
*/
|
||||
public function getSystemValue($key) {
|
||||
return \OCP\Config::getSystemValue($key, '');
|
||||
public function getSystemValue($key, $default = '') {
|
||||
return \OCP\Config::getSystemValue($key, $default);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Writes a new app wide value
|
||||
*
|
||||
* @param string $appName the appName that we want to store the value under
|
||||
* @param string $key the key of the value, under which will be saved
|
||||
* @param string $value the value that should be stored
|
||||
@@ -45,17 +49,20 @@ class AllConfig implements \OCP\IConfig {
|
||||
|
||||
/**
|
||||
* Looks up an app wide defined value
|
||||
*
|
||||
* @param string $appName the appName that we stored the value under
|
||||
* @param string $key the key of the value, under which it was saved
|
||||
* @param string $default the default value to be returned if the value isn't set
|
||||
* @return string the saved value
|
||||
*/
|
||||
public function getAppValue($appName, $key) {
|
||||
return \OCP\Config::getAppValue($appName, $key, '');
|
||||
public function getAppValue($appName, $key, $default = '') {
|
||||
return \OCP\Config::getAppValue($appName, $key, $default);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set a user defined value
|
||||
*
|
||||
* @param string $userId the userId of the user that we want to store the value under
|
||||
* @param string $appName the appName that we want to store the value under
|
||||
* @param string $key the key under which the value is being stored
|
||||
@@ -67,11 +74,14 @@ class AllConfig implements \OCP\IConfig {
|
||||
|
||||
/**
|
||||
* Shortcut for getting a user defined value
|
||||
*
|
||||
* @param string $userId the userId of the user that we want to store the value under
|
||||
* @param string $appName the appName that we stored the value under
|
||||
* @param string $key the key under which the value is being stored
|
||||
* @param string $default the default value to be returned if the value isn't set
|
||||
* @return string
|
||||
*/
|
||||
public function getUserValue($userId, $appName, $key){
|
||||
return \OCP\Config::getUserValue($userId, $appName, $key);
|
||||
public function getUserValue($userId, $appName, $key, $default = '') {
|
||||
return \OCP\Config::getUserValue($userId, $appName, $key, $default);
|
||||
}
|
||||
}
|
||||
|
||||
+22
-20
@@ -33,7 +33,7 @@ class OC_API {
|
||||
const USER_AUTH = 1;
|
||||
const SUBADMIN_AUTH = 2;
|
||||
const ADMIN_AUTH = 3;
|
||||
|
||||
|
||||
/**
|
||||
* API Response Codes
|
||||
*/
|
||||
@@ -41,13 +41,13 @@ class OC_API {
|
||||
const RESPOND_SERVER_ERROR = 996;
|
||||
const RESPOND_NOT_FOUND = 998;
|
||||
const RESPOND_UNKNOWN_ERROR = 999;
|
||||
|
||||
|
||||
/**
|
||||
* api actions
|
||||
*/
|
||||
protected static $actions = array();
|
||||
private static $logoutRequired = false;
|
||||
|
||||
|
||||
/**
|
||||
* registers an api call
|
||||
* @param string $method the http method
|
||||
@@ -58,7 +58,7 @@ class OC_API {
|
||||
* @param array $defaults
|
||||
* @param array $requirements
|
||||
*/
|
||||
public static function register($method, $url, $action, $app,
|
||||
public static function register($method, $url, $action, $app,
|
||||
$authLevel = OC_API::USER_AUTH,
|
||||
$defaults = array(),
|
||||
$requirements = array()) {
|
||||
@@ -75,7 +75,7 @@ class OC_API {
|
||||
}
|
||||
self::$actions[$name][] = array('app' => $app, 'action' => $action, 'authlevel' => $authLevel);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* handles an api call
|
||||
* @param array $parameters
|
||||
@@ -125,7 +125,7 @@ class OC_API {
|
||||
|
||||
self::respond($response, $format);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* merge the returned result objects into one response
|
||||
* @param array $responses
|
||||
@@ -166,32 +166,31 @@ class OC_API {
|
||||
// Maybe any that are not OC_API::RESPOND_SERVER_ERROR
|
||||
// Merge failed responses if more than one
|
||||
$data = array();
|
||||
$meta = array();
|
||||
foreach($shipped['failed'] as $failure) {
|
||||
$data = array_merge_recursive($data, $failure['response']->getData());
|
||||
}
|
||||
$picked = reset($shipped['failed']);
|
||||
$code = $picked['response']->getStatusCode();
|
||||
$response = new OC_OCS_Result($data, $code);
|
||||
$meta = $picked['response']->getMeta();
|
||||
$response = new OC_OCS_Result($data, $code, $meta['message']);
|
||||
return $response;
|
||||
} elseif(!empty($shipped['succeeded'])) {
|
||||
$responses = array_merge($shipped['succeeded'], $thirdparty['succeeded']);
|
||||
} elseif(!empty($thirdparty['failed'])) {
|
||||
// Merge failed responses if more than one
|
||||
$data = array();
|
||||
$meta = array();
|
||||
foreach($thirdparty['failed'] as $failure) {
|
||||
$data = array_merge_recursive($data, $failure['response']->getData());
|
||||
}
|
||||
$picked = reset($thirdparty['failed']);
|
||||
$code = $picked['response']->getStatusCode();
|
||||
$response = new OC_OCS_Result($data, $code);
|
||||
$meta = $picked['response']->getMeta();
|
||||
$response = new OC_OCS_Result($data, $code, $meta['message']);
|
||||
return $response;
|
||||
} else {
|
||||
$responses = $thirdparty['succeeded'];
|
||||
}
|
||||
// Merge the successful responses
|
||||
$meta = array();
|
||||
$data = array();
|
||||
|
||||
foreach($responses as $app => $response) {
|
||||
@@ -200,22 +199,25 @@ class OC_API {
|
||||
} else {
|
||||
$data = array_merge_recursive($data, $response['response']->getData());
|
||||
}
|
||||
$codes[] = $response['response']->getStatusCode();
|
||||
$codes[] = array('code' => $response['response']->getStatusCode(),
|
||||
'meta' => $response['response']->getMeta());
|
||||
}
|
||||
|
||||
// Use any non 100 status codes
|
||||
$statusCode = 100;
|
||||
$statusMessage = null;
|
||||
foreach($codes as $code) {
|
||||
if($code != 100) {
|
||||
$statusCode = $code;
|
||||
if($code['code'] != 100) {
|
||||
$statusCode = $code['code'];
|
||||
$statusMessage = $code['meta']['message'];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
$result = new OC_OCS_Result($data, $statusCode);
|
||||
$result = new OC_OCS_Result($data, $statusCode, $statusMessage);
|
||||
return $result;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* authenticate the api call
|
||||
* @param array $action the action details as supplied to OC_API::register()
|
||||
@@ -261,8 +263,8 @@ class OC_API {
|
||||
return false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* http basic auth
|
||||
* @return string|false (username, or false on failure)
|
||||
@@ -294,7 +296,7 @@ class OC_API {
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* respond to a call
|
||||
* @param OC_OCS_Result $result
|
||||
@@ -343,5 +345,5 @@ class OC_API {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -9,16 +9,35 @@
|
||||
namespace OC\BackgroundJob;
|
||||
|
||||
abstract class Job {
|
||||
/**
|
||||
* @var int $id
|
||||
*/
|
||||
protected $id;
|
||||
|
||||
/**
|
||||
* @var int $lastRun
|
||||
*/
|
||||
protected $lastRun;
|
||||
|
||||
/**
|
||||
* @var mixed $argument
|
||||
*/
|
||||
protected $argument;
|
||||
|
||||
/**
|
||||
* @param JobList $jobList
|
||||
* @param \OC\Log $logger
|
||||
*/
|
||||
public function execute($jobList) {
|
||||
public function execute($jobList, $logger = null) {
|
||||
$jobList->setLastRun($this);
|
||||
$this->run($this->argument);
|
||||
try {
|
||||
$this->run($this->argument);
|
||||
} catch (\Exception $e) {
|
||||
if ($logger) {
|
||||
$logger->error('Error while running background job: ' . $e->getMessage());
|
||||
}
|
||||
$jobList->remove($this, $this->argument);
|
||||
}
|
||||
}
|
||||
|
||||
abstract protected function run($argument);
|
||||
|
||||
@@ -20,9 +20,10 @@ abstract class QueuedJob extends Job {
|
||||
* run the job, then remove it from the joblist
|
||||
*
|
||||
* @param JobList $jobList
|
||||
* @param \OC\Log $logger
|
||||
*/
|
||||
public function execute($jobList) {
|
||||
public function execute($jobList, $logger = null) {
|
||||
$jobList->remove($this);
|
||||
$this->run($this->argument);
|
||||
parent::execute($jobList, $logger);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,11 +31,11 @@ abstract class TimedJob extends Job {
|
||||
* run the job if
|
||||
*
|
||||
* @param JobList $jobList
|
||||
* @param \OC\Log $logger
|
||||
*/
|
||||
public function execute($jobList) {
|
||||
public function execute($jobList, $logger = null) {
|
||||
if ((time() - $this->lastRun) > $this->interval) {
|
||||
$jobList->setLastRun($this);
|
||||
$this->run($this->argument);
|
||||
parent::execute($jobList, $logger);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -64,7 +64,7 @@ class OC_Connector_Sabre_File extends OC_Connector_Sabre_Node implements Sabre_D
|
||||
}
|
||||
|
||||
// mark file as partial while uploading (ignored by the scanner)
|
||||
$partpath = $this->path . '.part';
|
||||
$partpath = $this->path . '.ocTransferId' . rand() . '.part';
|
||||
|
||||
// if file is located in /Shared we write the part file to the users
|
||||
// root folder because we can't create new files in /shared
|
||||
@@ -242,7 +242,10 @@ class OC_Connector_Sabre_File extends OC_Connector_Sabre_Node implements Sabre_D
|
||||
$fileExists = $fs->file_exists($targetPath);
|
||||
if ($renameOkay === false || $fileExists === false) {
|
||||
\OC_Log::write('webdav', '\OC\Files\Filesystem::rename() failed', \OC_Log::ERROR);
|
||||
$fs->unlink($targetPath);
|
||||
// only delete if an error occurred and the target file was already created
|
||||
if ($fileExists) {
|
||||
$fs->unlink($targetPath);
|
||||
}
|
||||
throw new Sabre_DAV_Exception();
|
||||
}
|
||||
|
||||
|
||||
@@ -101,6 +101,9 @@ class OC_DB {
|
||||
);
|
||||
$connectionParams['adapter'] = '\OC\DB\Adapter';
|
||||
$connectionParams['wrapperClass'] = 'OC\DB\Connection';
|
||||
// Send "SET NAMES utf8". Only required on PHP 5.3 below 5.3.6.
|
||||
// See http://stackoverflow.com/questions/4361459/php-pdo-charset-set-names#4361485
|
||||
$eventManager->addEventSubscriber(new \Doctrine\DBAL\Event\Listeners\MysqlSessionInit);
|
||||
break;
|
||||
case 'pgsql':
|
||||
$connectionParams = array(
|
||||
|
||||
@@ -176,13 +176,22 @@ class MDB2SchemaReader {
|
||||
$options['default'] = $default;
|
||||
break;
|
||||
case 'comments':
|
||||
$comment = (string)$child;
|
||||
$options['comment'] = $comment;
|
||||
//FIXME for now we ignore comments https://github.com/doctrine/dbal/pull/407
|
||||
//$comment = (string)$child;
|
||||
//$options['comment'] = $comment;
|
||||
break;
|
||||
case 'primary':
|
||||
$primary = $this->asBool($child);
|
||||
$options['primary'] = $primary;
|
||||
break;
|
||||
case 'precision':
|
||||
$precision = (string)$child;
|
||||
$options['precision'] = $precision;
|
||||
break;
|
||||
case 'scale':
|
||||
$scale = (string)$child;
|
||||
$options['scale'] = $scale;
|
||||
break;
|
||||
default:
|
||||
throw new \DomainException('Unknown element: ' . $child->getName());
|
||||
|
||||
|
||||
@@ -109,15 +109,13 @@ class OC_Files {
|
||||
$zip = false;
|
||||
$filename = $dir . '/' . $files;
|
||||
$name = $files;
|
||||
if ($xsendfile && OC_App::isEnabled('files_encryption')) {
|
||||
$xsendfile = false;
|
||||
}
|
||||
}
|
||||
OC_Util::obEnd();
|
||||
if ($zip or \OC\Files\Filesystem::isReadable($filename)) {
|
||||
if ( preg_match( "/MSIE/", $_SERVER["HTTP_USER_AGENT"] ) ) {
|
||||
header( 'Content-Disposition: attachment; filename="' . rawurlencode($name) . '"' );
|
||||
} else {
|
||||
header( 'Content-Disposition: attachment; filename*=UTF-8\'\'' . rawurlencode($name)
|
||||
. '; filename="' . rawurlencode($name) . '"' );
|
||||
}
|
||||
OC_Response::setContentDispositionHeader($name, 'attachment');
|
||||
header('Content-Transfer-Encoding: binary');
|
||||
OC_Response::disableCaching();
|
||||
if ($zip) {
|
||||
|
||||
Vendored
+20
-4
@@ -178,6 +178,10 @@ class Cache {
|
||||
if ($file['storage_mtime'] == 0) {
|
||||
$file['storage_mtime'] = $file['mtime'];
|
||||
}
|
||||
if ($file['encrypted'] or ($file['unencrypted_size'] > 0 and $file['mimetype'] === 'httpd/unix-directory')) {
|
||||
$file['encrypted_size'] = $file['size'];
|
||||
$file['size'] = $file['unencrypted_size'];
|
||||
}
|
||||
}
|
||||
return $files;
|
||||
} else {
|
||||
@@ -507,22 +511,34 @@ class Cache {
|
||||
$entry = $this->get($path);
|
||||
if ($entry && $entry['mimetype'] === 'httpd/unix-directory') {
|
||||
$id = $entry['fileid'];
|
||||
$sql = 'SELECT SUM(`size`) AS f1, MIN(`size`) AS f2 FROM `*PREFIX*filecache` '.
|
||||
$sql = 'SELECT SUM(`size`) AS f1, MIN(`size`) AS f2, ' .
|
||||
'SUM(`unencrypted_size`) AS f3 ' .
|
||||
'FROM `*PREFIX*filecache` ' .
|
||||
'WHERE `parent` = ? AND `storage` = ?';
|
||||
$result = \OC_DB::executeAudited($sql, array($id, $this->getNumericStorageId()));
|
||||
if ($row = $result->fetchRow()) {
|
||||
list($sum, $min) = array_values($row);
|
||||
list($sum, $min, $unencryptedSum) = array_values($row);
|
||||
$sum = (int)$sum;
|
||||
$min = (int)$min;
|
||||
$unencryptedSum = (int)$unencryptedSum;
|
||||
if ($min === -1) {
|
||||
$totalSize = $min;
|
||||
} else {
|
||||
$totalSize = $sum;
|
||||
}
|
||||
$update = array();
|
||||
if ($entry['size'] !== $totalSize) {
|
||||
$this->update($id, array('size' => $totalSize));
|
||||
$update['size'] = $totalSize;
|
||||
}
|
||||
if ($entry['unencrypted_size'] !== $unencryptedSum) {
|
||||
$update['unencrypted_size'] = $unencryptedSum;
|
||||
}
|
||||
if (count($update) > 0) {
|
||||
$this->update($id, $update);
|
||||
}
|
||||
if ($totalSize !== -1 and $unencryptedSum > 0) {
|
||||
$totalSize = $unencryptedSum;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
return $totalSize;
|
||||
|
||||
+1
-1
@@ -16,7 +16,7 @@ class HomeCache extends Cache {
|
||||
* @return int
|
||||
*/
|
||||
public function calculateFolderSize($path) {
|
||||
if ($path !== '/' and $path !== '') {
|
||||
if ($path !== '/' and $path !== '' and $path !== 'files') {
|
||||
return parent::calculateFolderSize($path);
|
||||
}
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user