summaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authorRobin Appelman <icewind@owncloud.com>2014-04-25 11:47:06 +0200
committerRobin Appelman <icewind@owncloud.com>2014-04-25 11:47:06 +0200
commit6c20a014eaecd19c3f68143485c6f74891ee9643 (patch)
tree84bd8e37536e7f28a25afd7586c209d38a25d610 /apps
parentcd0c5990f895bcdce47acf2dbf11ebadd920a404 (diff)
parent3fc809dfd80a296d7da922a06f9e13d446b3d3f0 (diff)
downloadnextcloud-server-6c20a014eaecd19c3f68143485c6f74891ee9643.tar.gz
nextcloud-server-6c20a014eaecd19c3f68143485c6f74891ee9643.zip
merge master into webdav-injection
Diffstat (limited to 'apps')
-rw-r--r--apps/files/css/files.css2
-rw-r--r--apps/files/js/file-upload.js4
-rw-r--r--apps/files/js/fileactions.js8
-rw-r--r--apps/files/js/filelist.js18
-rw-r--r--apps/files/js/files.js6
-rw-r--r--apps/files/l10n/ar.php1
-rw-r--r--apps/files/l10n/ast.php1
-rw-r--r--apps/files/l10n/bg_BG.php1
-rw-r--r--apps/files/l10n/bn_BD.php1
-rw-r--r--apps/files/l10n/ca.php3
-rw-r--r--apps/files/l10n/cs_CZ.php4
-rw-r--r--apps/files/l10n/cy_GB.php1
-rw-r--r--apps/files/l10n/da.php3
-rw-r--r--apps/files/l10n/de.php4
-rw-r--r--apps/files/l10n/de_CH.php1
-rw-r--r--apps/files/l10n/de_DE.php6
-rw-r--r--apps/files/l10n/el.php3
-rw-r--r--apps/files/l10n/en_GB.php6
-rw-r--r--apps/files/l10n/eo.php1
-rw-r--r--apps/files/l10n/es.php4
-rw-r--r--apps/files/l10n/es_AR.php3
-rw-r--r--apps/files/l10n/es_CL.php3
-rw-r--r--apps/files/l10n/es_CR.php7
-rw-r--r--apps/files/l10n/es_MX.php3
-rw-r--r--apps/files/l10n/et_EE.php4
-rw-r--r--apps/files/l10n/eu.php3
-rw-r--r--apps/files/l10n/fa.php1
-rw-r--r--apps/files/l10n/fi_FI.php5
-rw-r--r--apps/files/l10n/fr.php4
-rw-r--r--apps/files/l10n/gl.php4
-rw-r--r--apps/files/l10n/he.php1
-rw-r--r--apps/files/l10n/hi.php1
-rw-r--r--apps/files/l10n/hr.php1
-rw-r--r--apps/files/l10n/hu_HU.php3
-rw-r--r--apps/files/l10n/ia.php2
-rw-r--r--apps/files/l10n/id.php3
-rw-r--r--apps/files/l10n/is.php1
-rw-r--r--apps/files/l10n/it.php4
-rw-r--r--apps/files/l10n/ja.php3
-rw-r--r--apps/files/l10n/ka_GE.php1
-rw-r--r--apps/files/l10n/km.php1
-rw-r--r--apps/files/l10n/ko.php3
-rw-r--r--apps/files/l10n/ku_IQ.php1
-rw-r--r--apps/files/l10n/lb.php1
-rw-r--r--apps/files/l10n/lt_LT.php3
-rw-r--r--apps/files/l10n/lv.php1
-rw-r--r--apps/files/l10n/mk.php2
-rw-r--r--apps/files/l10n/ms_MY.php1
-rw-r--r--apps/files/l10n/nb_NO.php3
-rw-r--r--apps/files/l10n/nl.php4
-rw-r--r--apps/files/l10n/nn_NO.php1
-rw-r--r--apps/files/l10n/oc.php1
-rw-r--r--apps/files/l10n/or_IN.php7
-rw-r--r--apps/files/l10n/pa.php1
-rw-r--r--apps/files/l10n/pl.php4
-rw-r--r--apps/files/l10n/pt_BR.php4
-rw-r--r--apps/files/l10n/pt_PT.php3
-rw-r--r--apps/files/l10n/ro.php12
-rw-r--r--apps/files/l10n/ru.php3
-rw-r--r--apps/files/l10n/si_LK.php1
-rw-r--r--apps/files/l10n/sk_SK.php3
-rw-r--r--apps/files/l10n/sl.php4
-rw-r--r--apps/files/l10n/sq.php1
-rw-r--r--apps/files/l10n/sr.php1
-rw-r--r--apps/files/l10n/sr@latin.php1
-rw-r--r--apps/files/l10n/sv.php4
-rw-r--r--apps/files/l10n/ta_LK.php1
-rw-r--r--apps/files/l10n/th_TH.php1
-rw-r--r--apps/files/l10n/tr.php4
-rw-r--r--apps/files/l10n/ug.php1
-rw-r--r--apps/files/l10n/uk.php1
-rw-r--r--apps/files/l10n/vi.php1
-rw-r--r--apps/files/l10n/zh_CN.php3
-rw-r--r--apps/files/l10n/zh_HK.php1
-rw-r--r--apps/files/l10n/zh_TW.php2
-rw-r--r--apps/files/lib/app.php11
-rw-r--r--apps/files/lib/helper.php6
-rw-r--r--apps/files/tests/ajax_rename.php82
-rw-r--r--apps/files/tests/js/filesSpec.js35
-rw-r--r--apps/files_encryption/hooks/hooks.php133
-rw-r--r--apps/files_encryption/l10n/es_AR.php1
-rw-r--r--apps/files_encryption/l10n/pt_PT.php3
-rw-r--r--apps/files_encryption/l10n/sk_SK.php1
-rw-r--r--apps/files_encryption/l10n/zh_TW.php2
-rw-r--r--apps/files_encryption/lib/util.php102
-rw-r--r--apps/files_encryption/tests/hooks.php26
-rwxr-xr-xapps/files_encryption/tests/share.php51
-rwxr-xr-xapps/files_encryption/tests/util.php2
-rw-r--r--apps/files_external/l10n/es_AR.php1
-rw-r--r--apps/files_external/l10n/es_CL.php5
-rw-r--r--apps/files_external/l10n/et_EE.php5
-rw-r--r--apps/files_external/l10n/ia.php1
-rw-r--r--apps/files_external/l10n/sk_SK.php8
-rw-r--r--apps/files_external/l10n/sv.php6
-rw-r--r--apps/files_external/l10n/zh_TW.php1
-rwxr-xr-xapps/files_external/lib/config.php4
-rw-r--r--apps/files_external/tests/mountconfig.php5
-rw-r--r--apps/files_sharing/appinfo/app.php2
-rw-r--r--apps/files_sharing/appinfo/update.php127
-rw-r--r--apps/files_sharing/appinfo/version2
-rw-r--r--apps/files_sharing/l10n/bg_BG.php3
-rw-r--r--apps/files_sharing/lib/api.php12
-rw-r--r--apps/files_sharing/lib/cache.php110
-rw-r--r--apps/files_sharing/lib/helper.php73
-rw-r--r--apps/files_sharing/lib/permissions.php4
-rw-r--r--apps/files_sharing/lib/share/file.php141
-rw-r--r--apps/files_sharing/lib/sharedstorage.php294
-rw-r--r--apps/files_sharing/lib/updater.php77
-rw-r--r--apps/files_sharing/lib/watcher.php2
-rw-r--r--apps/files_sharing/tests/api.php99
-rw-r--r--apps/files_sharing/tests/base.php12
-rw-r--r--apps/files_sharing/tests/cache.php66
-rw-r--r--apps/files_sharing/tests/permissions.php15
-rw-r--r--apps/files_sharing/tests/updater.php55
-rw-r--r--apps/files_sharing/tests/watcher.php33
-rw-r--r--apps/user_ldap/js/ldapFilter.js100
-rw-r--r--apps/user_ldap/js/settings.js100
-rw-r--r--apps/user_ldap/l10n/af_ZA.php3
-rw-r--r--apps/user_ldap/l10n/en_GB.php1
-rw-r--r--apps/user_ldap/l10n/es.php2
-rw-r--r--apps/user_ldap/l10n/es_AR.php7
-rw-r--r--apps/user_ldap/l10n/es_CR.php6
-rw-r--r--apps/user_ldap/l10n/et_EE.php1
-rw-r--r--apps/user_ldap/l10n/ia.php3
-rw-r--r--apps/user_ldap/l10n/or_IN.php6
-rw-r--r--apps/user_ldap/l10n/sk_SK.php5
-rw-r--r--apps/user_ldap/lib/access.php25
-rw-r--r--apps/user_ldap/lib/ldap.php4
-rw-r--r--apps/user_ldap/lib/wizard.php1
-rw-r--r--apps/user_ldap/settings.php1
130 files changed, 1055 insertions, 1049 deletions
diff --git a/apps/files/css/files.css b/apps/files/css/files.css
index 1bac5d2b7db..474f1af0720 100644
--- a/apps/files/css/files.css
+++ b/apps/files/css/files.css
@@ -51,7 +51,7 @@
margin: 5px;
padding-left: 42px;
padding-bottom: 2px;
- background-position: initial;
+ background-position: left center;
cursor: pointer;
}
#new > ul > li > p {
diff --git a/apps/files/js/file-upload.js b/apps/files/js/file-upload.js
index 3879aa65888..03ebdccb32d 100644
--- a/apps/files/js/file-upload.js
+++ b/apps/files/js/file-upload.js
@@ -235,7 +235,7 @@ OC.Upload = {
var file = data.files[0];
try {
// FIXME: not so elegant... need to refactor that method to return a value
- Files.isFileNameValid(file.name, FileList.getCurrentDirectory());
+ Files.isFileNameValid(file.name);
}
catch (errorMessage) {
data.textStatus = 'invalidcharacters';
@@ -555,8 +555,6 @@ OC.Upload = {
throw t('files', 'URL cannot be empty');
} else if (type !== 'web' && !Files.isFileNameValid(filename)) {
// Files.isFileNameValid(filename) throws an exception itself
- } else if (FileList.getCurrentDirectory() === '/' && filename.toLowerCase() === 'shared') {
- throw t('files', 'In the home folder \'Shared\' is a reserved filename');
} else if (FileList.inList(filename)) {
throw t('files', '{new_name} already exists', {new_name: filename});
} else {
diff --git a/apps/files/js/fileactions.js b/apps/files/js/fileactions.js
index 631aebea954..ecdfa72a477 100644
--- a/apps/files/js/fileactions.js
+++ b/apps/files/js/fileactions.js
@@ -118,10 +118,6 @@ var FileActions = {
};
var addAction = function (name, action, displayName) {
- // NOTE: Temporary fix to prevent rename action in root of Shared directory
- if (name === 'Rename' && $('#dir').val() === '/Shared') {
- return true;
- }
if ((name === 'Download' || action !== defaultAction) && name !== 'Delete') {
@@ -160,7 +156,7 @@ var FileActions = {
addAction(name, ah, displayName);
}
});
- if(actions.Share && !($('#dir').val() === '/' && file === 'Shared')){
+ if(actions.Share){
displayName = t('files', 'Share');
addAction('Share', actions.Share, displayName);
}
@@ -223,7 +219,7 @@ $(document).ready(function () {
$('#fileList tr').each(function () {
FileActions.display($(this).children('td.filename'));
});
-
+
$('#fileList').trigger(jQuery.Event("fileActionsReady"));
});
diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js
index 9c749bb8f34..c33b638b5a6 100644
--- a/apps/files/js/filelist.js
+++ b/apps/files/js/filelist.js
@@ -178,6 +178,13 @@ window.FileList = {
if (type === 'dir') {
mime = mime || 'httpd/unix-directory';
}
+
+ // user should always be able to rename a share mount point
+ var allowRename = 0;
+ if (fileData.isShareMountPoint) {
+ allowRename = OC.PERMISSION_UPDATE;
+ }
+
//containing tr
var tr = $('<tr></tr>').attr({
"data-id" : fileData.id,
@@ -187,7 +194,7 @@ window.FileList = {
"data-mime": mime,
"data-mtime": mtime,
"data-etag": fileData.etag,
- "data-permissions": fileData.permissions || this.getDirectoryPermissions()
+ "data-permissions": fileData.permissions | allowRename || this.getDirectoryPermissions()
});
if (type === 'dir') {
@@ -283,6 +290,10 @@ window.FileList = {
mime = fileData.mimetype,
permissions = parseInt(fileData.permissions, 10) || 0;
+ if (fileData.isShareMountPoint) {
+ permissions = permissions | OC.PERMISSION_UPDATE;
+ }
+
if (type === 'dir') {
mime = mime || 'httpd/unix-directory';
}
@@ -572,7 +583,8 @@ window.FileList = {
input.focus();
//preselect input
var len = input.val().lastIndexOf('.');
- if (len === -1) {
+ if ( len === -1 ||
+ tr.data('type') === 'dir' ) {
len = input.val().length;
}
input.selectRange(0, len);
@@ -580,7 +592,7 @@ window.FileList = {
var filename = input.val();
if (filename !== oldname) {
// Files.isFileNameValid(filename) throws an exception itself
- Files.isFileNameValid(filename, FileList.getCurrentDirectory());
+ Files.isFileNameValid(filename);
if (FileList.inList(filename)) {
throw t('files', '{new_name} already exists', {new_name: filename});
}
diff --git a/apps/files/js/files.js b/apps/files/js/files.js
index 9f38263bef3..5e669a796a9 100644
--- a/apps/files/js/files.js
+++ b/apps/files/js/files.js
@@ -87,11 +87,9 @@ var Files = {
* Throws a string exception with an error message if
* the file name is not valid
*/
- isFileNameValid: function (name, root) {
+ isFileNameValid: function (name) {
var trimmedName = name.trim();
- if (trimmedName === '.'
- || trimmedName === '..'
- || (root === '/' && trimmedName.toLowerCase() === 'shared'))
+ if (trimmedName === '.' || trimmedName === '..')
{
throw t('files', '"{name}" is an invalid file name.', {name: name});
} else if (trimmedName.length === 0) {
diff --git a/apps/files/l10n/ar.php b/apps/files/l10n/ar.php
index e7c081b1c47..9a78e3bbff3 100644
--- a/apps/files/l10n/ar.php
+++ b/apps/files/l10n/ar.php
@@ -44,7 +44,6 @@ $TRANSLATIONS = array(
"Size" => "حجم",
"Modified" => "معدل",
"%s could not be renamed" => "%s لا يمكن إعادة تسميته. ",
-"Upload" => "رفع",
"File handling" => "التعامل مع الملف",
"Maximum upload size" => "الحد الأقصى لحجم الملفات التي يمكن رفعها",
"max. possible: " => "الحد الأقصى المسموح به",
diff --git a/apps/files/l10n/ast.php b/apps/files/l10n/ast.php
index c0b32e8e0cb..5c6af60be3d 100644
--- a/apps/files/l10n/ast.php
+++ b/apps/files/l10n/ast.php
@@ -19,7 +19,6 @@ $TRANSLATIONS = array(
"_Uploading %n file_::_Uploading %n files_" => array("",""),
"Name" => "Nome",
"Size" => "Tamañu",
-"Upload" => "Xubir",
"Save" => "Guardar",
"New folder" => "Nueva carpeta",
"Folder" => "Carpeta",
diff --git a/apps/files/l10n/bg_BG.php b/apps/files/l10n/bg_BG.php
index 2418010cdd9..d9cad21e79e 100644
--- a/apps/files/l10n/bg_BG.php
+++ b/apps/files/l10n/bg_BG.php
@@ -20,7 +20,6 @@ $TRANSLATIONS = array(
"Name" => "Име",
"Size" => "Размер",
"Modified" => "Променено",
-"Upload" => "Качване",
"Maximum upload size" => "Максимален размер за качване",
"0 is unlimited" => "Ползвайте 0 за без ограничения",
"Save" => "Запис",
diff --git a/apps/files/l10n/bn_BD.php b/apps/files/l10n/bn_BD.php
index 667a68bb627..4d71d7dacd3 100644
--- a/apps/files/l10n/bn_BD.php
+++ b/apps/files/l10n/bn_BD.php
@@ -27,7 +27,6 @@ $TRANSLATIONS = array(
"Name" => "রাম",
"Size" => "আকার",
"Modified" => "পরিবর্তিত",
-"Upload" => "আপলোড",
"File handling" => "ফাইল হ্যার্ডলিং",
"Maximum upload size" => "আপলোডের সর্বোচ্চ আকার",
"max. possible: " => "অনুমোদিত সর্বোচ্চ আকার",
diff --git a/apps/files/l10n/ca.php b/apps/files/l10n/ca.php
index 8ef9b764484..6938da220b2 100644
--- a/apps/files/l10n/ca.php
+++ b/apps/files/l10n/ca.php
@@ -35,7 +35,6 @@ $TRANSLATIONS = array(
"Could not get result from server." => "No hi ha resposta del servidor.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Hi ha una pujada en curs. Si abandoneu la pàgina la pujada es cancel·larà.",
"URL cannot be empty" => "L'URL no pot ser buit",
-"In the home folder 'Shared' is a reserved filename" => "A la carpeta inici 'Compartit' és un nom de fitxer reservat",
"{new_name} already exists" => "{new_name} ja existeix",
"Could not create file" => "No s'ha pogut crear el fitxer",
"Could not create folder" => "No s'ha pogut crear la carpeta",
@@ -62,9 +61,7 @@ $TRANSLATIONS = array(
"Name" => "Nom",
"Size" => "Mida",
"Modified" => "Modificat",
-"Invalid folder name. Usage of 'Shared' is reserved." => "Nom de carpeta no vàlid. L'ús de 'Shared' és reservat",
"%s could not be renamed" => "%s no es pot canviar el nom",
-"Upload" => "Puja",
"File handling" => "Gestió de fitxers",
"Maximum upload size" => "Mida màxima de pujada",
"max. possible: " => "màxim possible:",
diff --git a/apps/files/l10n/cs_CZ.php b/apps/files/l10n/cs_CZ.php
index 8aea17a7051..40bb288ca1a 100644
--- a/apps/files/l10n/cs_CZ.php
+++ b/apps/files/l10n/cs_CZ.php
@@ -35,7 +35,6 @@ $TRANSLATIONS = array(
"Could not get result from server." => "Nepodařilo se získat výsledek ze serveru.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Probíhá odesílání souboru. Opuštění stránky způsobí zrušení nahrávání.",
"URL cannot be empty" => "URL nemůže zůstat prázdná",
-"In the home folder 'Shared' is a reserved filename" => "V osobní složce je název 'Shared' rezervovaný",
"{new_name} already exists" => "{new_name} již existuje",
"Could not create file" => "Nepodařilo se vytvořit soubor",
"Could not create folder" => "Nepodařilo se vytvořit složku",
@@ -62,9 +61,8 @@ $TRANSLATIONS = array(
"Name" => "Název",
"Size" => "Velikost",
"Modified" => "Upraveno",
-"Invalid folder name. Usage of 'Shared' is reserved." => "Neplatný název složky. Použití 'Shared' je rezervováno.",
"%s could not be renamed" => "%s nemůže být přejmenován",
-"Upload" => "Odeslat",
+"Upload (max. %s)" => "Nahrát (max. %s)",
"File handling" => "Zacházení se soubory",
"Maximum upload size" => "Maximální velikost pro odesílání",
"max. possible: " => "největší možná: ",
diff --git a/apps/files/l10n/cy_GB.php b/apps/files/l10n/cy_GB.php
index b27e4c3bfc2..f0c12b2fdeb 100644
--- a/apps/files/l10n/cy_GB.php
+++ b/apps/files/l10n/cy_GB.php
@@ -32,7 +32,6 @@ $TRANSLATIONS = array(
"Name" => "Enw",
"Size" => "Maint",
"Modified" => "Addaswyd",
-"Upload" => "Llwytho i fyny",
"File handling" => "Trafod ffeiliau",
"Maximum upload size" => "Maint mwyaf llwytho i fyny",
"max. possible: " => "mwyaf. posib:",
diff --git a/apps/files/l10n/da.php b/apps/files/l10n/da.php
index 6a7ea4745cc..9a6ea9c0dce 100644
--- a/apps/files/l10n/da.php
+++ b/apps/files/l10n/da.php
@@ -35,7 +35,6 @@ $TRANSLATIONS = array(
"Could not get result from server." => "Kunne ikke hente resultat fra server.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Fil upload kører. Hvis du forlader siden nu, vil uploadet blive annuleret.",
"URL cannot be empty" => "URL kan ikke være tom",
-"In the home folder 'Shared' is a reserved filename" => "Navnet 'Shared' er reserveret i hjemmemappen.",
"{new_name} already exists" => "{new_name} eksisterer allerede",
"Could not create file" => "Kunne ikke oprette fil",
"Could not create folder" => "Kunne ikke oprette mappe",
@@ -62,9 +61,7 @@ $TRANSLATIONS = array(
"Name" => "Navn",
"Size" => "Størrelse",
"Modified" => "Ændret",
-"Invalid folder name. Usage of 'Shared' is reserved." => "Ugyldig mappenavn. 'Shared' er reserveret.",
"%s could not be renamed" => "%s kunne ikke omdøbes",
-"Upload" => "Upload",
"File handling" => "Filhåndtering",
"Maximum upload size" => "Maksimal upload-størrelse",
"max. possible: " => "max. mulige: ",
diff --git a/apps/files/l10n/de.php b/apps/files/l10n/de.php
index 401ee243f28..1d15469dac6 100644
--- a/apps/files/l10n/de.php
+++ b/apps/files/l10n/de.php
@@ -35,7 +35,6 @@ $TRANSLATIONS = array(
"Could not get result from server." => "Ergebnis konnte nicht vom Server abgerufen werden.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Dateiupload läuft. Wenn Du die Seite jetzt verlässt, wird der Upload abgebrochen.",
"URL cannot be empty" => "Die URL darf nicht leer sein",
-"In the home folder 'Shared' is a reserved filename" => "Das Benutzerverzeichnis 'Shared' ist ein reservierter Dateiname",
"{new_name} already exists" => "{new_name} existiert bereits",
"Could not create file" => "Die Datei konnte nicht erstellt werden",
"Could not create folder" => "Der Ordner konnte nicht erstellt werden",
@@ -62,9 +61,8 @@ $TRANSLATIONS = array(
"Name" => "Name",
"Size" => "Größe",
"Modified" => "Geändert",
-"Invalid folder name. Usage of 'Shared' is reserved." => "Ungültiger Verzeichnisname. Die Nutzung von 'Shared' ist reserviert.",
"%s could not be renamed" => "%s konnte nicht umbenannt werden",
-"Upload" => "Hochladen",
+"Upload (max. %s)" => "Hochladen (max. %s)",
"File handling" => "Dateibehandlung",
"Maximum upload size" => "Maximale Upload-Größe",
"max. possible: " => "maximal möglich:",
diff --git a/apps/files/l10n/de_CH.php b/apps/files/l10n/de_CH.php
index f797be99e98..907b9e1b67e 100644
--- a/apps/files/l10n/de_CH.php
+++ b/apps/files/l10n/de_CH.php
@@ -36,7 +36,6 @@ $TRANSLATIONS = array(
"Size" => "Grösse",
"Modified" => "Geändert",
"%s could not be renamed" => "%s konnte nicht umbenannt werden",
-"Upload" => "Hochladen",
"File handling" => "Dateibehandlung",
"Maximum upload size" => "Maximale Upload-Grösse",
"max. possible: " => "maximal möglich:",
diff --git a/apps/files/l10n/de_DE.php b/apps/files/l10n/de_DE.php
index 4768faa97da..41ca83e6f87 100644
--- a/apps/files/l10n/de_DE.php
+++ b/apps/files/l10n/de_DE.php
@@ -35,7 +35,6 @@ $TRANSLATIONS = array(
"Could not get result from server." => "Ergebnis konnte nicht vom Server abgerufen werden.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Dateiupload läuft. Wenn Sie die Seite jetzt verlassen, wird der Upload abgebrochen.",
"URL cannot be empty" => "Die URL darf nicht leer sein",
-"In the home folder 'Shared' is a reserved filename" => "Das Benutzerverzeichnis 'Shared' ist ein reservierter Dateiname",
"{new_name} already exists" => "{new_name} existiert bereits",
"Could not create file" => "Die Datei konnte nicht erstellt werden",
"Could not create folder" => "Der Ordner konnte nicht erstellt werden",
@@ -62,9 +61,8 @@ $TRANSLATIONS = array(
"Name" => "Name",
"Size" => "Größe",
"Modified" => "Geändert",
-"Invalid folder name. Usage of 'Shared' is reserved." => "Ungültiger Verzeichnisname. Die Nutzung von 'Shared' ist reserviert.",
"%s could not be renamed" => "%s konnte nicht umbenannt werden",
-"Upload" => "Hochladen",
+"Upload (max. %s)" => "Hochladen (max. %s)",
"File handling" => "Dateibehandlung",
"Maximum upload size" => "Maximale Upload-Größe",
"max. possible: " => "maximal möglich:",
@@ -76,7 +74,7 @@ $TRANSLATIONS = array(
"New" => "Neu",
"New text file" => "Neue Textdatei",
"Text file" => "Textdatei",
-"New folder" => "Neues Ordner",
+"New folder" => "Neuer Ordner",
"Folder" => "Ordner",
"From link" => "Von einem Link",
"Deleted files" => "Gelöschte Dateien",
diff --git a/apps/files/l10n/el.php b/apps/files/l10n/el.php
index cf2022c2d7f..f103d0621e5 100644
--- a/apps/files/l10n/el.php
+++ b/apps/files/l10n/el.php
@@ -35,7 +35,6 @@ $TRANSLATIONS = array(
"Could not get result from server." => "Αδυναμία λήψης αποτελέσματος από το διακομιστή.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Η αποστολή του αρχείου βρίσκεται σε εξέλιξη. Το κλείσιμο της σελίδας θα ακυρώσει την αποστολή.",
"URL cannot be empty" => "Η URL δεν πρέπει να είναι κενή",
-"In the home folder 'Shared' is a reserved filename" => "Στον αρχικό φάκελο το όνομα 'Shared' διατηρείται από το σύστημα",
"{new_name} already exists" => "{new_name} υπάρχει ήδη",
"Could not create file" => "Αδυναμία δημιουργίας αρχείου",
"Could not create folder" => "Αδυναμία δημιουργίας φακέλου",
@@ -62,9 +61,7 @@ $TRANSLATIONS = array(
"Name" => "Όνομα",
"Size" => "Μέγεθος",
"Modified" => "Τροποποιήθηκε",
-"Invalid folder name. Usage of 'Shared' is reserved." => "Άκυρο όνομα φακέλου. Η χρήση του 'Shared' διατηρείται από το σύστημα.",
"%s could not be renamed" => "Αδυναμία μετονομασίας του %s",
-"Upload" => "Μεταφόρτωση",
"File handling" => "Διαχείριση αρχείων",
"Maximum upload size" => "Μέγιστο μέγεθος αποστολής",
"max. possible: " => "μέγιστο δυνατό:",
diff --git a/apps/files/l10n/en_GB.php b/apps/files/l10n/en_GB.php
index 705f6b99b0b..93e1007e37c 100644
--- a/apps/files/l10n/en_GB.php
+++ b/apps/files/l10n/en_GB.php
@@ -35,7 +35,6 @@ $TRANSLATIONS = array(
"Could not get result from server." => "Could not get result from server.",
"File upload is in progress. Leaving the page now will cancel the upload." => "File upload is in progress. Leaving the page now will cancel the upload.",
"URL cannot be empty" => "URL cannot be empty",
-"In the home folder 'Shared' is a reserved filename" => "In the home folder 'Shared' is a reserved file name",
"{new_name} already exists" => "{new_name} already exists",
"Could not create file" => "Could not create file",
"Could not create folder" => "Could not create folder",
@@ -62,9 +61,8 @@ $TRANSLATIONS = array(
"Name" => "Name",
"Size" => "Size",
"Modified" => "Modified",
-"Invalid folder name. Usage of 'Shared' is reserved." => "Invalid folder name. Usage of 'Shared' is reserved.",
"%s could not be renamed" => "%s could not be renamed",
-"Upload" => "Upload",
+"Upload (max. %s)" => "Upload (max. %s)",
"File handling" => "File handling",
"Maximum upload size" => "Maximum upload size",
"max. possible: " => "max. possible: ",
@@ -88,6 +86,6 @@ $TRANSLATIONS = array(
"Upload too large" => "Upload too large",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "The files you are trying to upload exceed the maximum size for file uploads on this server.",
"Files are being scanned, please wait." => "Files are being scanned, please wait.",
-"Current scanning" => "Current scanning"
+"Current scanning" => "Currently scanning"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files/l10n/eo.php b/apps/files/l10n/eo.php
index a6e0d553177..dfa6f7ec038 100644
--- a/apps/files/l10n/eo.php
+++ b/apps/files/l10n/eo.php
@@ -50,7 +50,6 @@ $TRANSLATIONS = array(
"Size" => "Grando",
"Modified" => "Modifita",
"%s could not be renamed" => "%s ne povis alinomiĝi",
-"Upload" => "Alŝuti",
"File handling" => "Dosieradministro",
"Maximum upload size" => "Maksimuma alŝutogrando",
"max. possible: " => "maks. ebla: ",
diff --git a/apps/files/l10n/es.php b/apps/files/l10n/es.php
index 10a378c371b..fd1d915ea8c 100644
--- a/apps/files/l10n/es.php
+++ b/apps/files/l10n/es.php
@@ -35,7 +35,6 @@ $TRANSLATIONS = array(
"Could not get result from server." => "No se pudo obtener respuesta del servidor.",
"File upload is in progress. Leaving the page now will cancel the upload." => "La subida del archivo está en proceso. Si sale de la página ahora, la subida será cancelada.",
"URL cannot be empty" => "La dirección URL no puede estar vacía",
-"In the home folder 'Shared' is a reserved filename" => "En la carpeta home, no se puede usar 'Shared'",
"{new_name} already exists" => "{new_name} ya existe",
"Could not create file" => "No se pudo crear el archivo",
"Could not create folder" => "No se pudo crear la carpeta",
@@ -62,9 +61,8 @@ $TRANSLATIONS = array(
"Name" => "Nombre",
"Size" => "Tamaño",
"Modified" => "Modificado",
-"Invalid folder name. Usage of 'Shared' is reserved." => "Nombre de carpeta inválido. El uso de \"Shared\" esta reservado.",
"%s could not be renamed" => "%s no pudo ser renombrado",
-"Upload" => "Subir",
+"Upload (max. %s)" => "Subida (máx. %s)",
"File handling" => "Administración de archivos",
"Maximum upload size" => "Tamaño máximo de subida",
"max. possible: " => "máx. posible:",
diff --git a/apps/files/l10n/es_AR.php b/apps/files/l10n/es_AR.php
index f78615fc923..4d4a349a10d 100644
--- a/apps/files/l10n/es_AR.php
+++ b/apps/files/l10n/es_AR.php
@@ -31,7 +31,6 @@ $TRANSLATIONS = array(
"Could not get result from server." => "No se pudo obtener resultados del servidor.",
"File upload is in progress. Leaving the page now will cancel the upload." => "La subida del archivo está en proceso. Si salís de la página ahora, la subida se cancelará.",
"URL cannot be empty" => "La URL no puede estar vacía",
-"In the home folder 'Shared' is a reserved filename" => "En el directorio inicial 'Shared' es un nombre de archivo reservado",
"{new_name} already exists" => "{new_name} ya existe",
"Could not create file" => "No se pudo crear el archivo",
"Could not create folder" => "No se pudo crear el directorio",
@@ -57,9 +56,7 @@ $TRANSLATIONS = array(
"Name" => "Nombre",
"Size" => "Tamaño",
"Modified" => "Modificado",
-"Invalid folder name. Usage of 'Shared' is reserved." => "Nombre de directorio inválido. 'Shared' está reservado.",
"%s could not be renamed" => "No se pudo renombrar %s",
-"Upload" => "Subir",
"File handling" => "Tratamiento de archivos",
"Maximum upload size" => "Tamaño máximo de subida",
"max. possible: " => "máx. posible:",
diff --git a/apps/files/l10n/es_CL.php b/apps/files/l10n/es_CL.php
index 8e051d1c389..fa856ad5292 100644
--- a/apps/files/l10n/es_CL.php
+++ b/apps/files/l10n/es_CL.php
@@ -2,11 +2,12 @@
$TRANSLATIONS = array(
"Files" => "Archivos",
"Share" => "Compartir",
+"Rename" => "Renombrar",
"Error" => "Error",
"_%n folder_::_%n folders_" => array("",""),
"_%n file_::_%n files_" => array("",""),
"_Uploading %n file_::_Uploading %n files_" => array("",""),
-"Upload" => "Subir",
+"New folder" => "Nuevo directorio",
"Download" => "Descargar"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files/l10n/es_CR.php b/apps/files/l10n/es_CR.php
new file mode 100644
index 00000000000..0157af093e9
--- /dev/null
+++ b/apps/files/l10n/es_CR.php
@@ -0,0 +1,7 @@
+<?php
+$TRANSLATIONS = array(
+"_%n folder_::_%n folders_" => array("",""),
+"_%n file_::_%n files_" => array("",""),
+"_Uploading %n file_::_Uploading %n files_" => array("","")
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files/l10n/es_MX.php b/apps/files/l10n/es_MX.php
index ea7db0d7b9c..f5f773c760d 100644
--- a/apps/files/l10n/es_MX.php
+++ b/apps/files/l10n/es_MX.php
@@ -31,7 +31,6 @@ $TRANSLATIONS = array(
"Could not get result from server." => "No se pudo obtener respuesta del servidor.",
"File upload is in progress. Leaving the page now will cancel the upload." => "La subida del archivo está en proceso. Si sale de la página ahora, la subida será cancelada.",
"URL cannot be empty" => "La dirección URL no puede estar vacía",
-"In the home folder 'Shared' is a reserved filename" => "En la carpeta de inicio, 'Shared' es un nombre reservado",
"{new_name} already exists" => "{new_name} ya existe",
"Could not create file" => "No se pudo crear el archivo",
"Could not create folder" => "No se pudo crear la carpeta",
@@ -57,9 +56,7 @@ $TRANSLATIONS = array(
"Name" => "Nombre",
"Size" => "Tamaño",
"Modified" => "Modificado",
-"Invalid folder name. Usage of 'Shared' is reserved." => "Nombre de carpeta inválido. El uso de \"Shared\" esta reservado.",
"%s could not be renamed" => "%s no pudo ser renombrado",
-"Upload" => "Subir",
"File handling" => "Administración de archivos",
"Maximum upload size" => "Tamaño máximo de subida",
"max. possible: " => "máx. posible:",
diff --git a/apps/files/l10n/et_EE.php b/apps/files/l10n/et_EE.php
index 4f0614feb5e..4af93fa9ba2 100644
--- a/apps/files/l10n/et_EE.php
+++ b/apps/files/l10n/et_EE.php
@@ -35,7 +35,6 @@ $TRANSLATIONS = array(
"Could not get result from server." => "Serverist ei saadud tulemusi",
"File upload is in progress. Leaving the page now will cancel the upload." => "Faili üleslaadimine on töös. Lehelt lahkumine katkestab selle üleslaadimise.",
"URL cannot be empty" => "URL ei saa olla tühi",
-"In the home folder 'Shared' is a reserved filename" => "Kodukataloogis 'Shared' on reserveeritud failinimi",
"{new_name} already exists" => "{new_name} on juba olemas",
"Could not create file" => "Ei suuda luua faili",
"Could not create folder" => "Ei suuda luua kataloogi",
@@ -62,9 +61,8 @@ $TRANSLATIONS = array(
"Name" => "Nimi",
"Size" => "Suurus",
"Modified" => "Muudetud",
-"Invalid folder name. Usage of 'Shared' is reserved." => "Vigane kausta nimi. Nime 'Shared' kasutamine on reserveeritud.",
"%s could not be renamed" => "%s ümbernimetamine ebaõnnestus",
-"Upload" => "Lae üles",
+"Upload (max. %s)" => "Üleslaadimine (max. %s)",
"File handling" => "Failide käsitlemine",
"Maximum upload size" => "Maksimaalne üleslaadimise suurus",
"max. possible: " => "maks. võimalik: ",
diff --git a/apps/files/l10n/eu.php b/apps/files/l10n/eu.php
index d59dd396283..e1bb7033ebd 100644
--- a/apps/files/l10n/eu.php
+++ b/apps/files/l10n/eu.php
@@ -31,7 +31,6 @@ $TRANSLATIONS = array(
"Could not get result from server." => "Ezin da zerbitzaritik emaitzik lortu",
"File upload is in progress. Leaving the page now will cancel the upload." => "Fitxategien igoera martxan da. Orria orain uzteak igoera ezeztatutko du.",
"URL cannot be empty" => "URLa ezin da hutsik egon",
-"In the home folder 'Shared' is a reserved filename" => "Etxeko (home) karpetan 'Shared' erreserbatutako fitxategi izena da",
"{new_name} already exists" => "{new_name} dagoeneko existitzen da",
"Could not create file" => "Ezin izan da fitxategia sortu",
"Could not create folder" => "Ezin izan da karpeta sortu",
@@ -57,9 +56,7 @@ $TRANSLATIONS = array(
"Name" => "Izena",
"Size" => "Tamaina",
"Modified" => "Aldatuta",
-"Invalid folder name. Usage of 'Shared' is reserved." => "Baliogabeako karpeta izena. 'Shared' izena erreserbatuta dago.",
"%s could not be renamed" => "%s ezin da berrizendatu",
-"Upload" => "Igo",
"File handling" => "Fitxategien kudeaketa",
"Maximum upload size" => "Igo daitekeen gehienezko tamaina",
"max. possible: " => "max, posiblea:",
diff --git a/apps/files/l10n/fa.php b/apps/files/l10n/fa.php
index 2e8f6255e24..4d2a929195f 100644
--- a/apps/files/l10n/fa.php
+++ b/apps/files/l10n/fa.php
@@ -35,7 +35,6 @@ $TRANSLATIONS = array(
"Size" => "اندازه",
"Modified" => "تاریخ",
"%s could not be renamed" => "%s نمیتواند تغییر نام دهد.",
-"Upload" => "بارگزاری",
"File handling" => "اداره پرونده ها",
"Maximum upload size" => "حداکثر اندازه بارگزاری",
"max. possible: " => "حداکثرمقدارممکن:",
diff --git a/apps/files/l10n/fi_FI.php b/apps/files/l10n/fi_FI.php
index b6383c144de..ba3c921dfee 100644
--- a/apps/files/l10n/fi_FI.php
+++ b/apps/files/l10n/fi_FI.php
@@ -53,14 +53,15 @@ $TRANSLATIONS = array(
"\"{name}\" is an invalid file name." => "\"{name}\" on virheellinen tiedostonimi.",
"Your storage is full, files can not be updated or synced anymore!" => "Tallennustila on loppu, tiedostoja ei voi enää päivittää tai synkronoida!",
"Your storage is almost full ({usedSpacePercent}%)" => "Tallennustila on melkein loppu ({usedSpacePercent}%)",
+"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "Salaussovellus on käytössä, mutta salausavaimia ei ole alustettu. Ole hyvä ja kirjaudu sisään uudelleen.",
+"Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." => "Salaussovelluksen salausavain on virheellinen. Ole hyvä ja päivitä salausavain henkilökohtaisissa asetuksissasi jotta voit taas avata salatuskirjoitetut tiedostosi.",
"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Salaus poistettiin käytöstä, mutta tiedostosi ovat edelleen salattuina. Siirry henkilökohtaisiin asetuksiin avataksesi tiedostojesi salauksen.",
"Your download is being prepared. This might take some time if the files are big." => "Lataustasi valmistellaan. Tämä saattaa kestää hetken, jos tiedostot ovat suuria kooltaan.",
"Name" => "Nimi",
"Size" => "Koko",
"Modified" => "Muokattu",
-"Invalid folder name. Usage of 'Shared' is reserved." => "Virheellinen kansion nimi. 'Shared':n käyttö on varattu.",
"%s could not be renamed" => "kohteen %s nimeäminen uudelleen epäonnistui",
-"Upload" => "Lähetä",
+"Upload (max. %s)" => "Lähetys (enintään %s)",
"File handling" => "Tiedostonhallinta",
"Maximum upload size" => "Lähetettävän tiedoston suurin sallittu koko",
"max. possible: " => "suurin mahdollinen:",
diff --git a/apps/files/l10n/fr.php b/apps/files/l10n/fr.php
index 0eed6a70f91..26ba8445f4f 100644
--- a/apps/files/l10n/fr.php
+++ b/apps/files/l10n/fr.php
@@ -35,7 +35,6 @@ $TRANSLATIONS = array(
"Could not get result from server." => "Ne peut recevoir les résultats du serveur.",
"File upload is in progress. Leaving the page now will cancel the upload." => "L'envoi du fichier est en cours. Quitter cette page maintenant annulera l'envoi du fichier.",
"URL cannot be empty" => "L'URL ne peut pas être vide",
-"In the home folder 'Shared' is a reserved filename" => "Dans le dossier home, 'Partagé' est un nom de fichier réservé",
"{new_name} already exists" => "{new_name} existe déjà",
"Could not create file" => "Impossible de créer le fichier",
"Could not create folder" => "Impossible de créer le dossier",
@@ -62,9 +61,8 @@ $TRANSLATIONS = array(
"Name" => "Nom",
"Size" => "Taille",
"Modified" => "Modifié",
-"Invalid folder name. Usage of 'Shared' is reserved." => "Nom de dossier invalide. L'utilisation du mot 'Shared' est réservée.",
"%s could not be renamed" => "%s ne peut être renommé",
-"Upload" => "Envoyer",
+"Upload (max. %s)" => "Envoi (max. %s)",
"File handling" => "Gestion des fichiers",
"Maximum upload size" => "Taille max. d'envoi",
"max. possible: " => "Max. possible :",
diff --git a/apps/files/l10n/gl.php b/apps/files/l10n/gl.php
index 9fe6546de51..d9c6d003603 100644
--- a/apps/files/l10n/gl.php
+++ b/apps/files/l10n/gl.php
@@ -35,7 +35,6 @@ $TRANSLATIONS = array(
"Could not get result from server." => "Non foi posíbel obter o resultado do servidor.",
"File upload is in progress. Leaving the page now will cancel the upload." => "O envío do ficheiro está en proceso. Saír agora da páxina cancelará o envío.",
"URL cannot be empty" => "O URL non pode quedar en branco.",
-"In the home folder 'Shared' is a reserved filename" => "«Shared» dentro do cartafol persoal é un nome reservado",
"{new_name} already exists" => "Xa existe un {new_name}",
"Could not create file" => "Non foi posíbel crear o ficheiro",
"Could not create folder" => "Non foi posíbel crear o cartafol",
@@ -62,9 +61,8 @@ $TRANSLATIONS = array(
"Name" => "Nome",
"Size" => "Tamaño",
"Modified" => "Modificado",
-"Invalid folder name. Usage of 'Shared' is reserved." => "Nome de cartafol non válido. O uso de «Shared» está reservado.",
"%s could not be renamed" => "%s non pode cambiar de nome",
-"Upload" => "Enviar",
+"Upload (max. %s)" => "Envío (máx. %s)",
"File handling" => "Manexo de ficheiro",
"Maximum upload size" => "Tamaño máximo do envío",
"max. possible: " => "máx. posíbel: ",
diff --git a/apps/files/l10n/he.php b/apps/files/l10n/he.php
index ab8640a91d1..6279e675db2 100644
--- a/apps/files/l10n/he.php
+++ b/apps/files/l10n/he.php
@@ -32,7 +32,6 @@ $TRANSLATIONS = array(
"Name" => "שם",
"Size" => "גודל",
"Modified" => "זמן שינוי",
-"Upload" => "העלאה",
"File handling" => "טיפול בקבצים",
"Maximum upload size" => "גודל העלאה מקסימלי",
"max. possible: " => "המרבי האפשרי: ",
diff --git a/apps/files/l10n/hi.php b/apps/files/l10n/hi.php
index b4234b51376..13fded26719 100644
--- a/apps/files/l10n/hi.php
+++ b/apps/files/l10n/hi.php
@@ -5,7 +5,6 @@ $TRANSLATIONS = array(
"_%n folder_::_%n folders_" => array("",""),
"_%n file_::_%n files_" => array("",""),
"_Uploading %n file_::_Uploading %n files_" => array("",""),
-"Upload" => "अपलोड ",
"Save" => "सहेजें"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files/l10n/hr.php b/apps/files/l10n/hr.php
index ef978e6cfb7..0876dcdd1ec 100644
--- a/apps/files/l10n/hr.php
+++ b/apps/files/l10n/hr.php
@@ -19,7 +19,6 @@ $TRANSLATIONS = array(
"Name" => "Ime",
"Size" => "Veličina",
"Modified" => "Zadnja promjena",
-"Upload" => "Učitaj",
"File handling" => "datoteka za rukovanje",
"Maximum upload size" => "Maksimalna veličina prijenosa",
"max. possible: " => "maksimalna moguća: ",
diff --git a/apps/files/l10n/hu_HU.php b/apps/files/l10n/hu_HU.php
index e4ab355c9b1..9ed00326826 100644
--- a/apps/files/l10n/hu_HU.php
+++ b/apps/files/l10n/hu_HU.php
@@ -31,7 +31,6 @@ $TRANSLATIONS = array(
"Could not get result from server." => "A kiszolgálótól nem kapható meg az eredmény.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Fájlfeltöltés van folyamatban. Az oldal elhagyása megszakítja a feltöltést.",
"URL cannot be empty" => "Az URL-cím nem maradhat kitöltetlenül",
-"In the home folder 'Shared' is a reserved filename" => "A kiindulási mappában a 'Shared' egy belső használatra fenntartott név",
"{new_name} already exists" => "{new_name} már létezik",
"Could not create file" => "Az állomány nem hozható létre",
"Could not create folder" => "A mappa nem hozható létre",
@@ -57,9 +56,7 @@ $TRANSLATIONS = array(
"Name" => "Név",
"Size" => "Méret",
"Modified" => "Módosítva",
-"Invalid folder name. Usage of 'Shared' is reserved." => "Érvénytelen mappanév. A 'Shared' a rendszer számára fenntartott elnevezés.",
"%s could not be renamed" => "%s átnevezése nem sikerült",
-"Upload" => "Feltöltés",
"File handling" => "Fájlkezelés",
"Maximum upload size" => "Maximális feltölthető fájlméret",
"max. possible: " => "max. lehetséges: ",
diff --git a/apps/files/l10n/ia.php b/apps/files/l10n/ia.php
index 420e48395c7..ff4cb0225b0 100644
--- a/apps/files/l10n/ia.php
+++ b/apps/files/l10n/ia.php
@@ -12,11 +12,11 @@ $TRANSLATIONS = array(
"Name" => "Nomine",
"Size" => "Dimension",
"Modified" => "Modificate",
-"Upload" => "Incargar",
"Maximum upload size" => "Dimension maxime de incargamento",
"Save" => "Salveguardar",
"New" => "Nove",
"Text file" => "File de texto",
+"New folder" => "Nove dossier",
"Folder" => "Dossier",
"Nothing in here. Upload something!" => "Nihil hic. Incarga alcun cosa!",
"Download" => "Discargar",
diff --git a/apps/files/l10n/id.php b/apps/files/l10n/id.php
index 8356c5465eb..d8c0a47789c 100644
--- a/apps/files/l10n/id.php
+++ b/apps/files/l10n/id.php
@@ -30,7 +30,6 @@ $TRANSLATIONS = array(
"Could not get result from server." => "Tidak mendapatkan hasil dari server.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Berkas sedang diunggah. Meninggalkan halaman ini akan membatalkan proses.",
"URL cannot be empty" => "URL tidak boleh kosong",
-"In the home folder 'Shared' is a reserved filename" => "Pada folder home, 'Shared' adalah nama berkas yang sudah digunakan",
"{new_name} already exists" => "{new_name} sudah ada",
"Could not create file" => "Tidak dapat membuat berkas",
"Could not create folder" => "Tidak dapat membuat folder",
@@ -55,9 +54,7 @@ $TRANSLATIONS = array(
"Name" => "Nama",
"Size" => "Ukuran",
"Modified" => "Dimodifikasi",
-"Invalid folder name. Usage of 'Shared' is reserved." => "Nama folder tidak sah. Menggunakan 'Shared' sudah digunakan.",
"%s could not be renamed" => "%s tidak dapat diubah nama",
-"Upload" => "Unggah",
"File handling" => "Penanganan berkas",
"Maximum upload size" => "Ukuran pengunggahan maksimum",
"max. possible: " => "Kemungkinan maks.:",
diff --git a/apps/files/l10n/is.php b/apps/files/l10n/is.php
index 00503028e0e..b8e23b6a300 100644
--- a/apps/files/l10n/is.php
+++ b/apps/files/l10n/is.php
@@ -27,7 +27,6 @@ $TRANSLATIONS = array(
"Name" => "Nafn",
"Size" => "Stærð",
"Modified" => "Breytt",
-"Upload" => "Senda inn",
"File handling" => "Meðhöndlun skrár",
"Maximum upload size" => "Hámarks stærð innsendingar",
"max. possible: " => "hámark mögulegt: ",
diff --git a/apps/files/l10n/it.php b/apps/files/l10n/it.php
index 9539496a3fc..c77fb57c596 100644
--- a/apps/files/l10n/it.php
+++ b/apps/files/l10n/it.php
@@ -35,7 +35,6 @@ $TRANSLATIONS = array(
"Could not get result from server." => "Impossibile ottenere il risultato dal server.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Caricamento del file in corso. La chiusura della pagina annullerà il caricamento.",
"URL cannot be empty" => "L'URL non può essere vuoto.",
-"In the home folder 'Shared' is a reserved filename" => "Nella cartella home 'Shared' è un nome riservato",
"{new_name} already exists" => "{new_name} esiste già",
"Could not create file" => "Impossibile creare il file",
"Could not create folder" => "Impossibile creare la cartella",
@@ -62,9 +61,8 @@ $TRANSLATIONS = array(
"Name" => "Nome",
"Size" => "Dimensione",
"Modified" => "Modificato",
-"Invalid folder name. Usage of 'Shared' is reserved." => "Nome della cartella non valido. L'uso di 'Shared' è riservato.",
"%s could not be renamed" => "%s non può essere rinominato",
-"Upload" => "Carica",
+"Upload (max. %s)" => "Carica (massimo %s)",
"File handling" => "Gestione file",
"Maximum upload size" => "Dimensione massima upload",
"max. possible: " => "numero mass.: ",
diff --git a/apps/files/l10n/ja.php b/apps/files/l10n/ja.php
index dd8d4e4e3f6..361fd835ce1 100644
--- a/apps/files/l10n/ja.php
+++ b/apps/files/l10n/ja.php
@@ -35,7 +35,6 @@ $TRANSLATIONS = array(
"Could not get result from server." => "サーバーから結果を取得できませんでした。",
"File upload is in progress. Leaving the page now will cancel the upload." => "ファイル転送を実行中です。今このページから移動するとアップロードが中止されます。",
"URL cannot be empty" => "URL は空にできません",
-"In the home folder 'Shared' is a reserved filename" => "ホームフォルダーでは、'Shared' はシステムが使用する予約済みのファイル名です",
"{new_name} already exists" => "{new_name} はすでに存在します",
"Could not create file" => "ファイルを作成できませんでした",
"Could not create folder" => "フォルダーを作成できませんでした",
@@ -62,9 +61,7 @@ $TRANSLATIONS = array(
"Name" => "名前",
"Size" => "サイズ",
"Modified" => "更新日時",
-"Invalid folder name. Usage of 'Shared' is reserved." => "無効なフォルダー名。「Shared」の利用は予約されています。",
"%s could not be renamed" => "%sの名前を変更できませんでした",
-"Upload" => "アップロード",
"File handling" => "ファイル操作",
"Maximum upload size" => "最大アップロードサイズ",
"max. possible: " => "最大容量: ",
diff --git a/apps/files/l10n/ka_GE.php b/apps/files/l10n/ka_GE.php
index f9749d72bb4..ad3a4bff1f1 100644
--- a/apps/files/l10n/ka_GE.php
+++ b/apps/files/l10n/ka_GE.php
@@ -32,7 +32,6 @@ $TRANSLATIONS = array(
"Name" => "სახელი",
"Size" => "ზომა",
"Modified" => "შეცვლილია",
-"Upload" => "ატვირთვა",
"File handling" => "ფაილის დამუშავება",
"Maximum upload size" => "მაქსიმუმ ატვირთის ზომა",
"max. possible: " => "მაქს. შესაძლებელი:",
diff --git a/apps/files/l10n/km.php b/apps/files/l10n/km.php
index a7a01ccab9d..30bb2998afa 100644
--- a/apps/files/l10n/km.php
+++ b/apps/files/l10n/km.php
@@ -8,7 +8,6 @@ $TRANSLATIONS = array(
"_Uploading %n file_::_Uploading %n files_" => array(""),
"Name" => "ឈ្មោះ",
"Size" => "ទំហំ",
-"Upload" => "ផ្ទុក​ឡើង",
"Save" => "រក្សាទុក",
"New folder" => "ថត​ថ្មី",
"Folder" => "ថត",
diff --git a/apps/files/l10n/ko.php b/apps/files/l10n/ko.php
index c0f0d7d4454..21c7ebcdc44 100644
--- a/apps/files/l10n/ko.php
+++ b/apps/files/l10n/ko.php
@@ -31,7 +31,6 @@ $TRANSLATIONS = array(
"Could not get result from server." => "서버에서 결과를 가져올 수 없습니다.",
"File upload is in progress. Leaving the page now will cancel the upload." => "파일 업로드가 진행 중입니다. 이 페이지를 벗어나면 업로드가 취소됩니다.",
"URL cannot be empty" => "URL이 비어있을 수 없음",
-"In the home folder 'Shared' is a reserved filename" => "'공유됨'은 홈 폴더의 예약된 파일 이름임",
"{new_name} already exists" => "{new_name}이(가) 이미 존재함",
"Could not create file" => "파일을 만들 수 없음",
"Could not create folder" => "폴더를 만들 수 없음",
@@ -57,9 +56,7 @@ $TRANSLATIONS = array(
"Name" => "이름",
"Size" => "크기",
"Modified" => "수정됨",
-"Invalid folder name. Usage of 'Shared' is reserved." => "폴더 이름이 잘못되었습니다. '공유됨'은 예약된 폴더 이름입니다.",
"%s could not be renamed" => "%s의 이름을 변경할 수 없습니다",
-"Upload" => "업로드",
"File handling" => "파일 처리",
"Maximum upload size" => "최대 업로드 크기",
"max. possible: " => "최대 가능:",
diff --git a/apps/files/l10n/ku_IQ.php b/apps/files/l10n/ku_IQ.php
index 6ec5819d380..1c9d615ee7e 100644
--- a/apps/files/l10n/ku_IQ.php
+++ b/apps/files/l10n/ku_IQ.php
@@ -7,7 +7,6 @@ $TRANSLATIONS = array(
"_%n file_::_%n files_" => array("",""),
"_Uploading %n file_::_Uploading %n files_" => array("",""),
"Name" => "ناو",
-"Upload" => "بارکردن",
"Save" => "پاشکه‌وتکردن",
"Folder" => "بوخچه",
"Download" => "داگرتن"
diff --git a/apps/files/l10n/lb.php b/apps/files/l10n/lb.php
index 38b5d672d02..27dc936600b 100644
--- a/apps/files/l10n/lb.php
+++ b/apps/files/l10n/lb.php
@@ -18,7 +18,6 @@ $TRANSLATIONS = array(
"Name" => "Numm",
"Size" => "Gréisst",
"Modified" => "Geännert",
-"Upload" => "Eroplueden",
"File handling" => "Fichier handling",
"Maximum upload size" => "Maximum Upload Gréisst ",
"max. possible: " => "max. méiglech:",
diff --git a/apps/files/l10n/lt_LT.php b/apps/files/l10n/lt_LT.php
index 50097e5f362..a8c30016d3c 100644
--- a/apps/files/l10n/lt_LT.php
+++ b/apps/files/l10n/lt_LT.php
@@ -31,7 +31,6 @@ $TRANSLATIONS = array(
"Could not get result from server." => "Nepavyko gauti rezultato iš serverio.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Failo įkėlimas pradėtas. Jei paliksite šį puslapį, įkėlimas nutrūks.",
"URL cannot be empty" => "URL negali būti tuščias.",
-"In the home folder 'Shared' is a reserved filename" => "Pradiniame aplanke failo pavadinimas „Shared“ yra rezervuotas",
"{new_name} already exists" => "{new_name} jau egzistuoja",
"Could not create file" => "Neįmanoma sukurti failo",
"Could not create folder" => "Neįmanoma sukurti aplanko",
@@ -57,9 +56,7 @@ $TRANSLATIONS = array(
"Name" => "Pavadinimas",
"Size" => "Dydis",
"Modified" => "Pakeista",
-"Invalid folder name. Usage of 'Shared' is reserved." => "Netinkamas aplanko pavadinimas. „Shared“ pavadinimas yra rezervuotas.",
"%s could not be renamed" => "%s negali būti pervadintas",
-"Upload" => "Įkelti",
"File handling" => "Failų tvarkymas",
"Maximum upload size" => "Maksimalus įkeliamo failo dydis",
"max. possible: " => "maks. galima:",
diff --git a/apps/files/l10n/lv.php b/apps/files/l10n/lv.php
index fcb1a59aa38..71f3976816d 100644
--- a/apps/files/l10n/lv.php
+++ b/apps/files/l10n/lv.php
@@ -36,7 +36,6 @@ $TRANSLATIONS = array(
"Size" => "Izmērs",
"Modified" => "Mainīts",
"%s could not be renamed" => "%s nevar tikt pārsaukts",
-"Upload" => "Augšupielādēt",
"File handling" => "Datņu pārvaldība",
"Maximum upload size" => "Maksimālais datņu augšupielādes apjoms",
"max. possible: " => "maksimālais iespējamais:",
diff --git a/apps/files/l10n/mk.php b/apps/files/l10n/mk.php
index fa6efd1aff3..e1ff2c0bc27 100644
--- a/apps/files/l10n/mk.php
+++ b/apps/files/l10n/mk.php
@@ -27,7 +27,6 @@ $TRANSLATIONS = array(
"Could not get result from server." => "Не можам да добијам резултат од серверот.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Подигање на датотека е во тек. Напуштење на страницата ќе го прекине.",
"URL cannot be empty" => "URL-то не може да биде празно",
-"In the home folder 'Shared' is a reserved filename" => "Во домашната папка, 'Shared' е резервирано има на датотека/папка",
"{new_name} already exists" => "{new_name} веќе постои",
"Could not create file" => "Не множам да креирам датотека",
"Could not create folder" => "Не можам да креирам папка",
@@ -49,7 +48,6 @@ $TRANSLATIONS = array(
"Size" => "Големина",
"Modified" => "Променето",
"%s could not be renamed" => "%s не може да биде преименуван",
-"Upload" => "Подигни",
"File handling" => "Ракување со датотеки",
"Maximum upload size" => "Максимална големина за подигање",
"max. possible: " => "макс. можно:",
diff --git a/apps/files/l10n/ms_MY.php b/apps/files/l10n/ms_MY.php
index df0054c3d00..af42a3838b6 100644
--- a/apps/files/l10n/ms_MY.php
+++ b/apps/files/l10n/ms_MY.php
@@ -19,7 +19,6 @@ $TRANSLATIONS = array(
"Name" => "Nama",
"Size" => "Saiz",
"Modified" => "Dimodifikasi",
-"Upload" => "Muat naik",
"File handling" => "Pengendalian fail",
"Maximum upload size" => "Saiz maksimum muat naik",
"max. possible: " => "maksimum:",
diff --git a/apps/files/l10n/nb_NO.php b/apps/files/l10n/nb_NO.php
index f1e2c2edeeb..9887087cca7 100644
--- a/apps/files/l10n/nb_NO.php
+++ b/apps/files/l10n/nb_NO.php
@@ -31,7 +31,6 @@ $TRANSLATIONS = array(
"Could not get result from server." => "Fikk ikke resultat fra serveren.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Filopplasting pågår. Forlater du siden nå avbrytes opplastingen.",
"URL cannot be empty" => "URL kan ikke være tom",
-"In the home folder 'Shared' is a reserved filename" => "I hjemmemappen er 'Shared' et reservert filnavn",
"{new_name} already exists" => "{new_name} finnes allerede",
"Could not create file" => "Klarte ikke å opprette fil",
"Could not create folder" => "Klarte ikke å opprette mappe",
@@ -57,9 +56,7 @@ $TRANSLATIONS = array(
"Name" => "Navn",
"Size" => "Størrelse",
"Modified" => "Endret",
-"Invalid folder name. Usage of 'Shared' is reserved." => "Ulovlig mappenavn. Bruken av 'Shared' er reservert.",
"%s could not be renamed" => "Kunne ikke gi nytt navn til %s",
-"Upload" => "Last opp",
"File handling" => "Filhåndtering",
"Maximum upload size" => "Maksimum opplastingsstørrelse",
"max. possible: " => "max. mulige:",
diff --git a/apps/files/l10n/nl.php b/apps/files/l10n/nl.php
index 946c7905b23..e33d26e38d9 100644
--- a/apps/files/l10n/nl.php
+++ b/apps/files/l10n/nl.php
@@ -35,7 +35,6 @@ $TRANSLATIONS = array(
"Could not get result from server." => "Kon het resultaat van de server niet terugkrijgen.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Bestandsupload is bezig. Wanneer de pagina nu verlaten wordt, stopt de upload.",
"URL cannot be empty" => "URL mag niet leeg zijn",
-"In the home folder 'Shared' is a reserved filename" => "in de home map 'Shared' is een gereserveerde bestandsnaam",
"{new_name} already exists" => "{new_name} bestaat al",
"Could not create file" => "Kon bestand niet creëren",
"Could not create folder" => "Kon niet creëren map",
@@ -62,9 +61,8 @@ $TRANSLATIONS = array(
"Name" => "Naam",
"Size" => "Grootte",
"Modified" => "Aangepast",
-"Invalid folder name. Usage of 'Shared' is reserved." => "Ongeldige mapnaam. Gebruik van 'Shared' is gereserveerd.",
"%s could not be renamed" => "%s kon niet worden hernoemd",
-"Upload" => "Uploaden",
+"Upload (max. %s)" => "Upload (max. %s)",
"File handling" => "Bestand",
"Maximum upload size" => "Maximale bestandsgrootte voor uploads",
"max. possible: " => "max. mogelijk: ",
diff --git a/apps/files/l10n/nn_NO.php b/apps/files/l10n/nn_NO.php
index bd17fa3386a..693bfccb093 100644
--- a/apps/files/l10n/nn_NO.php
+++ b/apps/files/l10n/nn_NO.php
@@ -42,7 +42,6 @@ $TRANSLATIONS = array(
"Size" => "Storleik",
"Modified" => "Endra",
"%s could not be renamed" => "Klarte ikkje å omdøypa på %s",
-"Upload" => "Last opp",
"File handling" => "Filhandtering",
"Maximum upload size" => "Maksimal opplastingsstorleik",
"max. possible: " => "maks. moglege:",
diff --git a/apps/files/l10n/oc.php b/apps/files/l10n/oc.php
index 7a24c81974e..f3d790a533f 100644
--- a/apps/files/l10n/oc.php
+++ b/apps/files/l10n/oc.php
@@ -19,7 +19,6 @@ $TRANSLATIONS = array(
"Name" => "Nom",
"Size" => "Talha",
"Modified" => "Modificat",
-"Upload" => "Amontcarga",
"File handling" => "Manejament de fichièr",
"Maximum upload size" => "Talha maximum d'amontcargament",
"max. possible: " => "max. possible: ",
diff --git a/apps/files/l10n/or_IN.php b/apps/files/l10n/or_IN.php
new file mode 100644
index 00000000000..0157af093e9
--- /dev/null
+++ b/apps/files/l10n/or_IN.php
@@ -0,0 +1,7 @@
+<?php
+$TRANSLATIONS = array(
+"_%n folder_::_%n folders_" => array("",""),
+"_%n file_::_%n files_" => array("",""),
+"_Uploading %n file_::_Uploading %n files_" => array("","")
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files/l10n/pa.php b/apps/files/l10n/pa.php
index b18d2071e08..3cf87242491 100644
--- a/apps/files/l10n/pa.php
+++ b/apps/files/l10n/pa.php
@@ -7,7 +7,6 @@ $TRANSLATIONS = array(
"_%n folder_::_%n folders_" => array("",""),
"_%n file_::_%n files_" => array("",""),
"_Uploading %n file_::_Uploading %n files_" => array("",""),
-"Upload" => "ਅੱਪਲੋਡ",
"Cancel upload" => "ਅੱਪਲੋਡ ਰੱਦ ਕਰੋ",
"Download" => "ਡਾਊਨਲੋਡ",
"Delete" => "ਹਟਾਓ"
diff --git a/apps/files/l10n/pl.php b/apps/files/l10n/pl.php
index 83126b3ea03..30c3496db33 100644
--- a/apps/files/l10n/pl.php
+++ b/apps/files/l10n/pl.php
@@ -35,7 +35,6 @@ $TRANSLATIONS = array(
"Could not get result from server." => "Nie można uzyskać wyniku z serwera.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Wysyłanie pliku jest w toku. Jeśli opuścisz tę stronę, wysyłanie zostanie przerwane.",
"URL cannot be empty" => "URL nie może być pusty",
-"In the home folder 'Shared' is a reserved filename" => "W katalogu domowym \"Shared\" jest zarezerwowana nazwa pliku",
"{new_name} already exists" => "{new_name} już istnieje",
"Could not create file" => "Nie można utworzyć pliku",
"Could not create folder" => "Nie można utworzyć folderu",
@@ -62,9 +61,8 @@ $TRANSLATIONS = array(
"Name" => "Nazwa",
"Size" => "Rozmiar",
"Modified" => "Modyfikacja",
-"Invalid folder name. Usage of 'Shared' is reserved." => "Niepoprawna nazwa folderu. Wykorzystanie \"Shared\" jest zarezerwowane.",
"%s could not be renamed" => "%s nie można zmienić nazwy",
-"Upload" => "Wyślij",
+"Upload (max. %s)" => "Wysyłka (max. %s)",
"File handling" => "Zarządzanie plikami",
"Maximum upload size" => "Maksymalny rozmiar wysyłanego pliku",
"max. possible: " => "maks. możliwy:",
diff --git a/apps/files/l10n/pt_BR.php b/apps/files/l10n/pt_BR.php
index 48c32e8887f..10d8892e18f 100644
--- a/apps/files/l10n/pt_BR.php
+++ b/apps/files/l10n/pt_BR.php
@@ -35,7 +35,6 @@ $TRANSLATIONS = array(
"Could not get result from server." => "Não foi possível obter o resultado do servidor.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Upload em andamento. Sair da página agora resultará no cancelamento do envio.",
"URL cannot be empty" => "URL não pode estar vazia",
-"In the home folder 'Shared' is a reserved filename" => "Na pasta home 'Shared- Compartilhada' é um nome reservado",
"{new_name} already exists" => "{new_name} já existe",
"Could not create file" => "Não foi possível criar o arquivo",
"Could not create folder" => "Não foi possível criar a pasta",
@@ -62,9 +61,8 @@ $TRANSLATIONS = array(
"Name" => "Nome",
"Size" => "Tamanho",
"Modified" => "Modificado",
-"Invalid folder name. Usage of 'Shared' is reserved." => "Nome da pasta inválido. Uso de 'Shared' é reservado.",
"%s could not be renamed" => "%s não pode ser renomeado",
-"Upload" => "Upload",
+"Upload (max. %s)" => "Envio (max. %s)",
"File handling" => "Tratamento de Arquivo",
"Maximum upload size" => "Tamanho máximo para carregar",
"max. possible: " => "max. possível:",
diff --git a/apps/files/l10n/pt_PT.php b/apps/files/l10n/pt_PT.php
index 0afb6b50157..c24d2cf8f38 100644
--- a/apps/files/l10n/pt_PT.php
+++ b/apps/files/l10n/pt_PT.php
@@ -31,7 +31,6 @@ $TRANSLATIONS = array(
"Could not get result from server." => "Não foi possível obter o resultado do servidor.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Envio de ficheiro em progresso. Irá cancelar o envio se sair da página agora.",
"URL cannot be empty" => "URL não pode estar vazio",
-"In the home folder 'Shared' is a reserved filename" => "Na pasta pessoal \"Partilhado\" é um nome de ficheiro reservado",
"{new_name} already exists" => "O nome {new_name} já existe",
"Could not create file" => "Não pôde criar ficheiro",
"Could not create folder" => "Não pôde criar pasta",
@@ -57,9 +56,7 @@ $TRANSLATIONS = array(
"Name" => "Nome",
"Size" => "Tamanho",
"Modified" => "Modificado",
-"Invalid folder name. Usage of 'Shared' is reserved." => "Nome de pasta inválido. Utilização de \"Partilhado\" está reservada.",
"%s could not be renamed" => "%s não pode ser renomeada",
-"Upload" => "Carregar",
"File handling" => "Manuseamento de ficheiros",
"Maximum upload size" => "Tamanho máximo de envio",
"max. possible: " => "max. possivel: ",
diff --git a/apps/files/l10n/ro.php b/apps/files/l10n/ro.php
index 6cda724df43..d3927f5daf0 100644
--- a/apps/files/l10n/ro.php
+++ b/apps/files/l10n/ro.php
@@ -3,7 +3,10 @@ $TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "%s nu se poate muta - Fișierul cu acest nume există deja ",
"Could not move %s" => "Nu se poate muta %s",
"File name cannot be empty." => "Numele fișierului nu poate rămâne gol.",
+"\"%s\" is an invalid file name." => "\"%s\" este un nume de fișier nevalid",
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nume nevalide, '\\', '/', '<', '>', ':', '\"', '|', '?' și '*' nu sunt permise.",
+"The target folder has been moved or deleted." => "Dosarul țintă a fost mutat sau șters.",
+"Not a valid source" => "Sursă nevalidă",
"Error while downloading %s to %s" => "Eroare la descarcarea %s in %s",
"Error when creating the file" => "Eroare la crearea fisierului",
"Folder name cannot be empty." => "Numele folderului nu poate fi liber.",
@@ -24,6 +27,8 @@ $TRANSLATIONS = array(
"Invalid directory." => "Dosar nevalid.",
"Files" => "Fișiere",
"Unable to upload {filename} as it is a directory or has 0 bytes" => "Nu se poate încărca {filename} deoarece este un director sau are mărimea de 0 octeți",
+"Total file size {size1} exceeds upload limit {size2}" => "Mărimea fișierului este {size1} ce depășește limita de incarcare de {size2}",
+"Not enough free space, you are uploading {size1} but only {size2} is left" => "Spațiu liber insuficient, încărcați {size1} însă doar {size2} disponibil rămas",
"Upload cancelled." => "Încărcare anulată.",
"Could not get result from server." => "Nu se poate obține rezultatul de la server.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Fișierul este în curs de încărcare. Părăsirea paginii va întrerupe încărcarea.",
@@ -31,6 +36,7 @@ $TRANSLATIONS = array(
"{new_name} already exists" => "{new_name} există deja",
"Could not create file" => "Nu s-a putut crea fisierul",
"Could not create folder" => "Nu s-a putut crea folderul",
+"Error fetching URL" => "Eroare încarcare URL",
"Share" => "Partajează",
"Delete permanently" => "Șterge permanent",
"Rename" => "Redenumește",
@@ -38,10 +44,12 @@ $TRANSLATIONS = array(
"Error" => "Eroare",
"Pending" => "În așteptare",
"Could not rename file" => "Nu s-a putut redenumi fisierul",
+"Error deleting file." => "Eroare la ștergerea fisierului.",
"_%n folder_::_%n folders_" => array("%n director","%n directoare","%n directoare"),
"_%n file_::_%n files_" => array("%n fișier","%n fișiere","%n fișiere"),
"{dirs} and {files}" => "{dirs} și {files}",
"_Uploading %n file_::_Uploading %n files_" => array("Se încarcă %n fișier.","Se încarcă %n fișiere.","Se încarcă %n fișiere."),
+"\"{name}\" is an invalid file name." => "\"{name}\" este un nume de fișier nevalid.",
"Your storage is full, files can not be updated or synced anymore!" => "Spațiul de stocare este plin, fișierele nu mai pot fi actualizate sau sincronizate!",
"Your storage is almost full ({usedSpacePercent}%)" => "Spațiul de stocare este aproape plin ({usedSpacePercent}%)",
"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "criptarea a fost disactivata dar fisierele sant inca criptate.va rog intrati in setarile personale pentru a decripta fisierele",
@@ -50,7 +58,7 @@ $TRANSLATIONS = array(
"Size" => "Mărime",
"Modified" => "Modificat",
"%s could not be renamed" => "%s nu a putut fi redenumit",
-"Upload" => "Încărcă",
+"Upload (max. %s)" => "Încarcă (max. %s)",
"File handling" => "Manipulare fișiere",
"Maximum upload size" => "Dimensiune maximă admisă la încărcare",
"max. possible: " => "max. posibil:",
@@ -60,7 +68,9 @@ $TRANSLATIONS = array(
"Maximum input size for ZIP files" => "Dimensiunea maximă de intrare pentru fișierele ZIP",
"Save" => "Salvează",
"New" => "Nou",
+"New text file" => "Un nou fișier text",
"Text file" => "Fișier text",
+"New folder" => "Un nou dosar",
"Folder" => "Dosar",
"From link" => "De la adresa",
"Deleted files" => "Fișiere șterse",
diff --git a/apps/files/l10n/ru.php b/apps/files/l10n/ru.php
index 17f06c6a200..a9430276e4f 100644
--- a/apps/files/l10n/ru.php
+++ b/apps/files/l10n/ru.php
@@ -35,7 +35,6 @@ $TRANSLATIONS = array(
"Could not get result from server." => "Не удалось получить ответ от сервера.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Идёт загрузка файла. Покинув страницу, вы прервёте загрузку.",
"URL cannot be empty" => "Ссылка не может быть пустой.",
-"In the home folder 'Shared' is a reserved filename" => "'Shared' - это зарезервированное имя файла в домашнем каталоге",
"{new_name} already exists" => "{new_name} уже существует",
"Could not create file" => "Не удалось создать файл",
"Could not create folder" => "Не удалось создать каталог",
@@ -62,9 +61,7 @@ $TRANSLATIONS = array(
"Name" => "Имя",
"Size" => "Размер",
"Modified" => "Дата изменения",
-"Invalid folder name. Usage of 'Shared' is reserved." => "Неправильное имя каталога. Имя 'Shared' зарезервировано.",
"%s could not be renamed" => "%s не может быть переименован",
-"Upload" => "Загрузка",
"File handling" => "Управление файлами",
"Maximum upload size" => "Максимальный размер загружаемого файла",
"max. possible: " => "макс. возможно: ",
diff --git a/apps/files/l10n/si_LK.php b/apps/files/l10n/si_LK.php
index a2809ee2f5d..ff6672f7112 100644
--- a/apps/files/l10n/si_LK.php
+++ b/apps/files/l10n/si_LK.php
@@ -19,7 +19,6 @@ $TRANSLATIONS = array(
"Name" => "නම",
"Size" => "ප්‍රමාණය",
"Modified" => "වෙනස් කළ",
-"Upload" => "උඩුගත කරන්න",
"File handling" => "ගොනු පරිහරණය",
"Maximum upload size" => "උඩුගත කිරීමක උපරිම ප්‍රමාණය",
"max. possible: " => "හැකි උපරිමය:",
diff --git a/apps/files/l10n/sk_SK.php b/apps/files/l10n/sk_SK.php
index cffb89c294d..6c46bbd7fa2 100644
--- a/apps/files/l10n/sk_SK.php
+++ b/apps/files/l10n/sk_SK.php
@@ -35,7 +35,6 @@ $TRANSLATIONS = array(
"Could not get result from server." => "Nepodarilo sa dostať výsledky zo servera.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Opustenie stránky zruší práve prebiehajúce odosielanie súboru.",
"URL cannot be empty" => "URL nemôže byť prázdna",
-"In the home folder 'Shared' is a reserved filename" => "V domovskom priečinku je názov \"Shared\" vyhradený názov súboru",
"{new_name} already exists" => "{new_name} už existuje",
"Could not create file" => "Nemožno vytvoriť súbor",
"Could not create folder" => "Nemožno vytvoriť priečinok",
@@ -62,9 +61,7 @@ $TRANSLATIONS = array(
"Name" => "Názov",
"Size" => "Veľkosť",
"Modified" => "Upravené",
-"Invalid folder name. Usage of 'Shared' is reserved." => "Názov priečinka je chybný. Použitie názvu 'Shared' nie je povolené.",
"%s could not be renamed" => "%s nemohol byť premenovaný",
-"Upload" => "Odoslať",
"File handling" => "Nastavenie správania sa k súborom",
"Maximum upload size" => "Maximálna veľkosť odosielaného súboru",
"max. possible: " => "najväčšie možné:",
diff --git a/apps/files/l10n/sl.php b/apps/files/l10n/sl.php
index fcb358bd7bd..ac304d992ca 100644
--- a/apps/files/l10n/sl.php
+++ b/apps/files/l10n/sl.php
@@ -35,7 +35,6 @@ $TRANSLATIONS = array(
"Could not get result from server." => "Ni mogoče pridobiti podatkov s strežnika.",
"File upload is in progress. Leaving the page now will cancel the upload." => "V teku je pošiljanje datoteke. Če zapustite to stran zdaj, bo pošiljanje preklicano.",
"URL cannot be empty" => "Polje naslova URL ne sme biti prazno",
-"In the home folder 'Shared' is a reserved filename" => "V domači mapi ni dovoljeno ustvariti mape z imenom 'Souporabe', saj je ime zadržano za javno mapo.",
"{new_name} already exists" => "{new_name} že obstaja",
"Could not create file" => "Ni mogoče ustvariti datoteke",
"Could not create folder" => "Ni mogoče ustvariti mape",
@@ -62,9 +61,8 @@ $TRANSLATIONS = array(
"Name" => "Ime",
"Size" => "Velikost",
"Modified" => "Spremenjeno",
-"Invalid folder name. Usage of 'Shared' is reserved." => "Neveljavno ime mape. Ime 'Souporaba' je zadržana za javno mapo.",
"%s could not be renamed" => "%s ni mogoče preimenovati",
-"Upload" => "Pošlji",
+"Upload (max. %s)" => "Pošiljanje (omejitev %s)",
"File handling" => "Upravljanje z datotekami",
"Maximum upload size" => "Največja velikost za pošiljanja",
"max. possible: " => "največ mogoče:",
diff --git a/apps/files/l10n/sq.php b/apps/files/l10n/sq.php
index ade4f769faa..a7f1cb34133 100644
--- a/apps/files/l10n/sq.php
+++ b/apps/files/l10n/sq.php
@@ -40,7 +40,6 @@ $TRANSLATIONS = array(
"Size" => "Madhësia",
"Modified" => "Ndryshuar",
"%s could not be renamed" => "Nuk është i mundur riemërtimi i %s",
-"Upload" => "Ngarko",
"File handling" => "Trajtimi i Skedarëve",
"Maximum upload size" => "Madhësia maksimale e nagarkimit",
"max. possible: " => "maks i mundshëm",
diff --git a/apps/files/l10n/sr.php b/apps/files/l10n/sr.php
index 44669e8167a..866d8dbdd03 100644
--- a/apps/files/l10n/sr.php
+++ b/apps/files/l10n/sr.php
@@ -32,7 +32,6 @@ $TRANSLATIONS = array(
"Name" => "Име",
"Size" => "Величина",
"Modified" => "Измењено",
-"Upload" => "Отпреми",
"File handling" => "Управљање датотекама",
"Maximum upload size" => "Највећа величина датотеке",
"max. possible: " => "највећа величина:",
diff --git a/apps/files/l10n/sr@latin.php b/apps/files/l10n/sr@latin.php
index a5c74860f78..38039a19fc1 100644
--- a/apps/files/l10n/sr@latin.php
+++ b/apps/files/l10n/sr@latin.php
@@ -15,7 +15,6 @@ $TRANSLATIONS = array(
"Name" => "Ime",
"Size" => "Veličina",
"Modified" => "Zadnja izmena",
-"Upload" => "Pošalji",
"Maximum upload size" => "Maksimalna veličina pošiljke",
"Save" => "Snimi",
"Nothing in here. Upload something!" => "Ovde nema ničeg. Pošaljite nešto!",
diff --git a/apps/files/l10n/sv.php b/apps/files/l10n/sv.php
index f420216228c..f3d0170a303 100644
--- a/apps/files/l10n/sv.php
+++ b/apps/files/l10n/sv.php
@@ -35,7 +35,6 @@ $TRANSLATIONS = array(
"Could not get result from server." => "Gick inte att hämta resultat från server.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Filuppladdning pågår. Lämnar du sidan så avbryts uppladdningen.",
"URL cannot be empty" => "URL kan ej vara tomt",
-"In the home folder 'Shared' is a reserved filename" => "I hemma katalogen 'Delat' är ett reserverat filnamn",
"{new_name} already exists" => "{new_name} finns redan",
"Could not create file" => "Kunde ej skapa fil",
"Could not create folder" => "Kunde ej skapa katalog",
@@ -62,9 +61,8 @@ $TRANSLATIONS = array(
"Name" => "Namn",
"Size" => "Storlek",
"Modified" => "Ändrad",
-"Invalid folder name. Usage of 'Shared' is reserved." => "Ogiltigt mappnamn. Användande av 'Shared' är reserverat av ownCloud",
"%s could not be renamed" => "%s kunde inte namnändras",
-"Upload" => "Ladda upp",
+"Upload (max. %s)" => "Ladda upp (max. %s)",
"File handling" => "Filhantering",
"Maximum upload size" => "Maximal storlek att ladda upp",
"max. possible: " => "max. möjligt:",
diff --git a/apps/files/l10n/ta_LK.php b/apps/files/l10n/ta_LK.php
index 257aacf1471..0ab17785b93 100644
--- a/apps/files/l10n/ta_LK.php
+++ b/apps/files/l10n/ta_LK.php
@@ -22,7 +22,6 @@ $TRANSLATIONS = array(
"Name" => "பெயர்",
"Size" => "அளவு",
"Modified" => "மாற்றப்பட்டது",
-"Upload" => "பதிவேற்றுக",
"File handling" => "கோப்பு கையாளுதல்",
"Maximum upload size" => "பதிவேற்றக்கூடிய ஆகக்கூடிய அளவு ",
"max. possible: " => "ஆகக் கூடியது:",
diff --git a/apps/files/l10n/th_TH.php b/apps/files/l10n/th_TH.php
index 8f5f15f2a34..f0fd29da7e4 100644
--- a/apps/files/l10n/th_TH.php
+++ b/apps/files/l10n/th_TH.php
@@ -31,7 +31,6 @@ $TRANSLATIONS = array(
"Name" => "ชื่อ",
"Size" => "ขนาด",
"Modified" => "แก้ไขแล้ว",
-"Upload" => "อัพโหลด",
"File handling" => "การจัดกาไฟล์",
"Maximum upload size" => "ขนาดไฟล์สูงสุดที่อัพโหลดได้",
"max. possible: " => "จำนวนสูงสุดที่สามารถทำได้: ",
diff --git a/apps/files/l10n/tr.php b/apps/files/l10n/tr.php
index 1f69dca628d..77c310fc9eb 100644
--- a/apps/files/l10n/tr.php
+++ b/apps/files/l10n/tr.php
@@ -35,7 +35,6 @@ $TRANSLATIONS = array(
"Could not get result from server." => "Sunucudan sonuç alınamadı.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Dosya yükleme işlemi sürüyor. Şimdi sayfadan ayrılırsanız işleminiz iptal olur.",
"URL cannot be empty" => "URL boş olamaz",
-"In the home folder 'Shared' is a reserved filename" => "Ev klasöründeki 'Paylaşılan', ayrılmış bir dosya adıdır",
"{new_name} already exists" => "{new_name} zaten mevcut",
"Could not create file" => "Dosya oluşturulamadı",
"Could not create folder" => "Klasör oluşturulamadı",
@@ -62,9 +61,8 @@ $TRANSLATIONS = array(
"Name" => "İsim",
"Size" => "Boyut",
"Modified" => "Değiştirilme",
-"Invalid folder name. Usage of 'Shared' is reserved." => "Geçersiz klasör adı. 'Shared' ismi ayrılmıştır.",
"%s could not be renamed" => "%s yeniden adlandırılamadı",
-"Upload" => "Yükle",
+"Upload (max. %s)" => "Yükle (azami: %s)",
"File handling" => "Dosya işlemleri",
"Maximum upload size" => "Maksimum yükleme boyutu",
"max. possible: " => "mümkün olan en fazla: ",
diff --git a/apps/files/l10n/ug.php b/apps/files/l10n/ug.php
index 13354c153b2..58ccba94c13 100644
--- a/apps/files/l10n/ug.php
+++ b/apps/files/l10n/ug.php
@@ -21,7 +21,6 @@ $TRANSLATIONS = array(
"Name" => "ئاتى",
"Size" => "چوڭلۇقى",
"Modified" => "ئۆزگەرتكەن",
-"Upload" => "يۈكلە",
"Save" => "ساقلا",
"New" => "يېڭى",
"Text file" => "تېكىست ھۆججەت",
diff --git a/apps/files/l10n/uk.php b/apps/files/l10n/uk.php
index 905d27c3ee2..5643dedb9d4 100644
--- a/apps/files/l10n/uk.php
+++ b/apps/files/l10n/uk.php
@@ -40,7 +40,6 @@ $TRANSLATIONS = array(
"Size" => "Розмір",
"Modified" => "Змінено",
"%s could not be renamed" => "%s не може бути перейменований",
-"Upload" => "Вивантажити",
"File handling" => "Робота з файлами",
"Maximum upload size" => "Максимальний розмір відвантажень",
"max. possible: " => "макс.можливе:",
diff --git a/apps/files/l10n/vi.php b/apps/files/l10n/vi.php
index 55f9bd25942..058add4bb73 100644
--- a/apps/files/l10n/vi.php
+++ b/apps/files/l10n/vi.php
@@ -55,7 +55,6 @@ $TRANSLATIONS = array(
"Size" => "Kích cỡ",
"Modified" => "Thay đổi",
"%s could not be renamed" => "%s không thể đổi tên",
-"Upload" => "Tải lên",
"File handling" => "Xử lý tập tin",
"Maximum upload size" => "Kích thước tối đa ",
"max. possible: " => "tối đa cho phép:",
diff --git a/apps/files/l10n/zh_CN.php b/apps/files/l10n/zh_CN.php
index 068f97c1ddf..82cc68a4995 100644
--- a/apps/files/l10n/zh_CN.php
+++ b/apps/files/l10n/zh_CN.php
@@ -31,7 +31,6 @@ $TRANSLATIONS = array(
"Could not get result from server." => "不能从服务器得到结果",
"File upload is in progress. Leaving the page now will cancel the upload." => "文件正在上传中。现在离开此页会导致上传动作被取消。",
"URL cannot be empty" => "URL不能为空",
-"In the home folder 'Shared' is a reserved filename" => "主目录里 'Shared' 是系统预留目录名",
"{new_name} already exists" => "{new_name} 已存在",
"Could not create file" => "不能创建文件",
"Could not create folder" => "不能创建文件夹",
@@ -57,9 +56,7 @@ $TRANSLATIONS = array(
"Name" => "名称",
"Size" => "大小",
"Modified" => "修改日期",
-"Invalid folder name. Usage of 'Shared' is reserved." => "无效的文件夹名。”Shared“ 是 Owncloud 预留的文件夹",
"%s could not be renamed" => "%s 不能被重命名",
-"Upload" => "上传",
"File handling" => "文件处理",
"Maximum upload size" => "最大上传大小",
"max. possible: " => "最大允许: ",
diff --git a/apps/files/l10n/zh_HK.php b/apps/files/l10n/zh_HK.php
index eaa32cd537a..7a701166e64 100644
--- a/apps/files/l10n/zh_HK.php
+++ b/apps/files/l10n/zh_HK.php
@@ -7,7 +7,6 @@ $TRANSLATIONS = array(
"_%n file_::_%n files_" => array(""),
"_Uploading %n file_::_Uploading %n files_" => array(""),
"Name" => "名稱",
-"Upload" => "上傳",
"Save" => "儲存",
"Download" => "下載",
"Delete" => "刪除"
diff --git a/apps/files/l10n/zh_TW.php b/apps/files/l10n/zh_TW.php
index 154efd563fd..92bc13189df 100644
--- a/apps/files/l10n/zh_TW.php
+++ b/apps/files/l10n/zh_TW.php
@@ -30,7 +30,6 @@ $TRANSLATIONS = array(
"Could not get result from server." => "無法從伺服器取回結果",
"File upload is in progress. Leaving the page now will cancel the upload." => "檔案上傳中,離開此頁面將會取消上傳。",
"URL cannot be empty" => "URL 不能留空",
-"In the home folder 'Shared' is a reserved filename" => "在家目錄中不能使用「共享」作為檔名",
"{new_name} already exists" => "{new_name} 已經存在",
"Could not create file" => "無法建立檔案",
"Could not create folder" => "無法建立資料夾",
@@ -55,7 +54,6 @@ $TRANSLATIONS = array(
"Size" => "大小",
"Modified" => "修改時間",
"%s could not be renamed" => "無法重新命名 %s",
-"Upload" => "上傳",
"File handling" => "檔案處理",
"Maximum upload size" => "上傳限制",
"max. possible: " => "最大允許:",
diff --git a/apps/files/lib/app.php b/apps/files/lib/app.php
index adfca669577..ed4aa32c662 100644
--- a/apps/files/lib/app.php
+++ b/apps/files/lib/app.php
@@ -54,13 +54,8 @@ class App {
'data' => NULL
);
- // rename to "/Shared" is denied
- if( $dir === '/' and $newname === 'Shared' ) {
- $result['data'] = array(
- 'message' => $this->l10n->t("Invalid folder name. Usage of 'Shared' is reserved.")
- );
// rename to non-existing folder is denied
- } else if (!$this->view->file_exists($dir)) {
+ if (!$this->view->file_exists($dir)) {
$result['data'] = array('message' => (string)$this->l10n->t(
'The target folder has been moved or deleted.',
array($dir)),
@@ -68,7 +63,7 @@ class App {
);
// rename to existing file is denied
} else if ($this->view->file_exists($dir . '/' . $newname)) {
-
+
$result['data'] = array(
'message' => $this->l10n->t(
"The name %s is already used in the folder %s. Please choose a different name.",
@@ -77,8 +72,6 @@ class App {
} else if (
// rename to "." is denied
$newname !== '.' and
- // rename of "/Shared" is denied
- !($dir === '/' and $oldname === 'Shared') and
// THEN try to rename
$this->view->rename($dir . '/' . $oldname, $dir . '/' . $newname)
) {
diff --git a/apps/files/lib/helper.php b/apps/files/lib/helper.php
index 2e3741cbdca..0ae87d12fbf 100644
--- a/apps/files/lib/helper.php
+++ b/apps/files/lib/helper.php
@@ -37,8 +37,7 @@ class Helper
$sid = explode(':', $sid);
if ($sid[0] === 'shared') {
$icon = \OC_Helper::mimetypeIcon('dir-shared');
- }
- if ($sid[0] !== 'local' and $sid[0] !== 'home') {
+ } elseif ($sid[0] !== 'local' and $sid[0] !== 'home') {
$icon = \OC_Helper::mimetypeIcon('dir-external');
}
}
@@ -97,6 +96,9 @@ class Helper
if (isset($i['displayname_owner'])) {
$entry['shareOwner'] = $i['displayname_owner'];
}
+ if (isset($i['is_share_mount_point'])) {
+ $entry['isShareMountPoint'] = $i['is_share_mount_point'];
+ }
return $entry;
}
diff --git a/apps/files/tests/ajax_rename.php b/apps/files/tests/ajax_rename.php
index cb62d22a7e2..74ca1e4495d 100644
--- a/apps/files/tests/ajax_rename.php
+++ b/apps/files/tests/ajax_rename.php
@@ -56,88 +56,6 @@ class Test_OC_Files_App_Rename extends \PHPUnit_Framework_TestCase {
}
/**
- * @brief test rename of file/folder named "Shared"
- */
- function testRenameSharedFolder() {
- $dir = '/';
- $oldname = 'Shared';
- $newname = 'new_name';
-
- $this->viewMock->expects($this->at(0))
- ->method('file_exists')
- ->with('/')
- ->will($this->returnValue(true));
-
- $result = $this->files->rename($dir, $oldname, $newname);
- $expected = array(
- 'success' => false,
- 'data' => array('message' => '%s could not be renamed')
- );
-
- $this->assertEquals($expected, $result);
- }
-
- /**
- * @brief test rename of file/folder named "Shared"
- */
- function testRenameSharedFolderInSubdirectory() {
- $dir = '/test';
- $oldname = 'Shared';
- $newname = 'new_name';
-
- $this->viewMock->expects($this->at(0))
- ->method('file_exists')
- ->with('/test')
- ->will($this->returnValue(true));
-
- $this->viewMock->expects($this->any())
- ->method('getFileInfo')
- ->will($this->returnValue(new \OC\Files\FileInfo(
- '/test',
- null,
- '/test',
- array(
- 'fileid' => 123,
- 'type' => 'dir',
- 'mimetype' => 'httpd/unix-directory',
- 'mtime' => 0,
- 'permissions' => 31,
- 'size' => 18,
- 'etag' => 'abcdef',
- 'directory' => '/',
- 'name' => 'new_name',
- ))));
-
- $result = $this->files->rename($dir, $oldname, $newname);
-
- $this->assertTrue($result['success']);
- $this->assertEquals(123, $result['data']['id']);
- $this->assertEquals('new_name', $result['data']['name']);
- $this->assertEquals(18, $result['data']['size']);
- $this->assertEquals('httpd/unix-directory', $result['data']['mimetype']);
- $icon = \OC_Helper::mimetypeIcon('dir');
- $icon = substr($icon, 0, -3) . 'svg';
- $this->assertEquals($icon, $result['data']['icon']);
- }
-
- /**
- * @brief test rename of file/folder to "Shared"
- */
- function testRenameFolderToShared() {
- $dir = '/';
- $oldname = 'oldname';
- $newname = 'Shared';
-
- $result = $this->files->rename($dir, $oldname, $newname);
- $expected = array(
- 'success' => false,
- 'data' => array('message' => "Invalid folder name. Usage of 'Shared' is reserved.")
- );
-
- $this->assertEquals($expected, $result);
- }
-
- /**
* @brief test rename of file/folder
*/
function testRenameFolder() {
diff --git a/apps/files/tests/js/filesSpec.js b/apps/files/tests/js/filesSpec.js
index 95bf87e03ec..018c8ef0f3c 100644
--- a/apps/files/tests/js/filesSpec.js
+++ b/apps/files/tests/js/filesSpec.js
@@ -48,41 +48,6 @@ describe('Files tests', function() {
expect(error).toEqual(false);
}
});
- it('Validates correct file names do not create Shared folder in root', function() {
- // create shared file in subfolder
- var error = false;
- try {
- expect(Files.isFileNameValid('shared', '/foo')).toEqual(true);
- expect(Files.isFileNameValid('Shared', '/foo')).toEqual(true);
- }
- catch (e) {
- error = e;
- }
- expect(error).toEqual(false);
-
- // create shared file in root
- var threwException = false;
- try {
- Files.isFileNameValid('Shared', '/');
- console.error('Invalid file name not detected');
- }
- catch (e) {
- threwException = true;
- }
- expect(threwException).toEqual(true);
-
- // create shared file in root
- var threwException = false;
- try {
- Files.isFileNameValid('shared', '/');
- console.error('Invalid file name not detected');
- }
- catch (e) {
- threwException = true;
- }
- expect(threwException).toEqual(true);
-
- });
it('Detects invalid file names', function() {
var fileNames = [
'',
diff --git a/apps/files_encryption/hooks/hooks.php b/apps/files_encryption/hooks/hooks.php
index 0b6c5adf3fb..5f0494e62ca 100644
--- a/apps/files_encryption/hooks/hooks.php
+++ b/apps/files_encryption/hooks/hooks.php
@@ -302,25 +302,6 @@ class Hooks {
*/
public static function postShared($params) {
- // NOTE: $params has keys:
- // [itemType] => file
- // itemSource -> int, filecache file ID
- // [parent] =>
- // [itemTarget] => /13
- // shareWith -> string, uid of user being shared to
- // fileTarget -> path of file being shared
- // uidOwner -> owner of the original file being shared
- // [shareType] => 0
- // [shareWith] => test1
- // [uidOwner] => admin
- // [permissions] => 17
- // [fileSource] => 13
- // [fileTarget] => /test8
- // [id] => 10
- // [token] =>
- // [run] => whether emitting script should continue to run
- // TODO: Should other kinds of item be encrypted too?
-
if (\OCP\App::isEnabled('files_encryption') === false) {
return true;
}
@@ -331,71 +312,22 @@ class Hooks {
$session = new \OCA\Encryption\Session($view);
$userId = \OCP\User::getUser();
$util = new Util($view, $userId);
- $path = $util->fileIdToPath($params['itemSource']);
-
- $share = $util->getParentFromShare($params['id']);
- //if parent is set, then this is a re-share action
- if ($share['parent'] !== null) {
-
- // get the parent from current share
- $parent = $util->getShareParent($params['parent']);
-
- // if parent has the same type than the child it is a 1:1 share
- if ($parent['item_type'] === $params['itemType']) {
-
- // prefix path with Shared
- $path = '/Shared' . $parent['file_target'];
- } else {
-
- // NOTE: parent is folder but shared was a file!
- // we try to rebuild the missing path
- // some examples we face here
- // user1 share folder1 with user2 folder1 has
- // the following structure
- // /folder1/subfolder1/subsubfolder1/somefile.txt
- // user2 re-share subfolder2 with user3
- // user3 re-share somefile.txt user4
- // so our path should be
- // /Shared/subfolder1/subsubfolder1/somefile.txt
- // while user3 is sharing
-
- if ($params['itemType'] === 'file') {
- // get target path
- $targetPath = $util->fileIdToPath($params['fileSource']);
- $targetPathSplit = array_reverse(explode('/', $targetPath));
-
- // init values
- $path = '';
- $sharedPart = ltrim($parent['file_target'], '/');
-
- // rebuild path
- foreach ($targetPathSplit as $pathPart) {
- if ($pathPart !== $sharedPart) {
- $path = '/' . $pathPart . $path;
- } else {
- break;
- }
- }
- // prefix path with Shared
- $path = '/Shared' . $parent['file_target'] . $path;
- } else {
- // prefix path with Shared
- $path = '/Shared' . $parent['file_target'] . $params['fileTarget'];
- }
- }
- }
+ $path = \OC\Files\Filesystem::getPath($params['fileSource']);
$sharingEnabled = \OCP\Share::isEnabled();
// get the path including mount point only if not a shared folder
- if (strncmp($path, '/Shared', strlen('/Shared') !== 0)) {
- // get path including the the storage mount point
- $path = $util->getPathWithMountPoint($params['itemSource']);
+ list($storage, ) = \OC\Files\Filesystem::resolvePath('/' . $userId . '/files' . $path);
+
+ if (!($storage instanceof \OC\Files\Storage\Local)) {
+ $mountPoint = 'files' . $storage->getMountPoint();
+ } else {
+ $mountPoint = '';
}
// if a folder was shared, get a list of all (sub-)folders
if ($params['itemType'] === 'folder') {
- $allFiles = $util->getAllFiles($path);
+ $allFiles = $util->getAllFiles($path, $mountPoint);
} else {
$allFiles = array($path);
}
@@ -412,13 +344,6 @@ class Hooks {
*/
public static function postUnshare($params) {
- // NOTE: $params has keys:
- // [itemType] => file
- // [itemSource] => 13
- // [shareType] => 0
- // [shareWith] => test1
- // [itemParent] =>
-
if (\OCP\App::isEnabled('files_encryption') === false) {
return true;
}
@@ -428,34 +353,7 @@ class Hooks {
$view = new \OC_FilesystemView('/');
$userId = \OCP\User::getUser();
$util = new Util($view, $userId);
- $path = $util->fileIdToPath($params['itemSource']);
-
- // check if this is a re-share
- if ($params['itemParent']) {
-
- // get the parent from current share
- $parent = $util->getShareParent($params['itemParent']);
-
- // get target path
- $targetPath = $util->fileIdToPath($params['itemSource']);
- $targetPathSplit = array_reverse(explode('/', $targetPath));
-
- // init values
- $path = '';
- $sharedPart = ltrim($parent['file_target'], '/');
-
- // rebuild path
- foreach ($targetPathSplit as $pathPart) {
- if ($pathPart !== $sharedPart) {
- $path = '/' . $pathPart . $path;
- } else {
- break;
- }
- }
-
- // prefix path with Shared
- $path = '/Shared' . $parent['file_target'] . $path;
- }
+ $path = \OC\Files\Filesystem::getPath($params['fileSource']);
// for group shares get a list of the group members
if ($params['shareType'] === \OCP\Share::SHARE_TYPE_GROUP) {
@@ -469,14 +367,17 @@ class Hooks {
}
// get the path including mount point only if not a shared folder
- if (strncmp($path, '/Shared', strlen('/Shared') !== 0)) {
- // get path including the the storage mount point
- $path = $util->getPathWithMountPoint($params['itemSource']);
+ list($storage, ) = \OC\Files\Filesystem::resolvePath('/' . $userId . '/files' . $path);
+
+ if (!($storage instanceof \OC\Files\Storage\Local)) {
+ $mountPoint = 'files' . $storage->getMountPoint();
+ } else {
+ $mountPoint = '';
}
// if we unshare a folder we need a list of all (sub-)files
if ($params['itemType'] === 'folder') {
- $allFiles = $util->getAllFiles($path);
+ $allFiles = $util->getAllFiles($path, $mountPoint);
} else {
$allFiles = array($path);
}
@@ -510,6 +411,8 @@ class Hooks {
// otherwise we perform a stream copy, so we get a new set of keys
$mp1 = $view->getMountPoint('/' . $user . '/files/' . $params['oldpath']);
$mp2 = $view->getMountPoint('/' . $user . '/files/' . $params['newpath']);
+ list($storage1, ) = Filesystem::resolvePath($params['oldpath']);
+
if ($mp1 === $mp2) {
self::$renamedFiles[$params['oldpath']] = array(
'uid' => $ownerOld,
diff --git a/apps/files_encryption/l10n/es_AR.php b/apps/files_encryption/l10n/es_AR.php
index bc1eedbf5eb..b885716f89b 100644
--- a/apps/files_encryption/l10n/es_AR.php
+++ b/apps/files_encryption/l10n/es_AR.php
@@ -16,6 +16,7 @@ $TRANSLATIONS = array(
"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." => "Por favor, asegúrese de que PHP 5.3.3 o una versión más reciente esté instalado y que OpenSSL junto con la extensión PHP esté habilitado y configurado apropiadamente. Por ahora, la aplicación de encriptación ha sido deshabilitada.",
"Following users are not set up for encryption:" => "Los siguientes usuarios no fueron configurados para encriptar:",
"Initial encryption started... This can take some time. Please wait." => "Encriptación inicial comenzada... Esto puede durar un tiempo. Por favor espere.",
+"Initial encryption running... Please try again later." => "Encriptación inicial corriendo... Por favor intente mas tarde. ",
"Go directly to your " => "Ve directamente a tu",
"personal settings" => "Configuración personal",
"Encryption" => "Encriptación",
diff --git a/apps/files_encryption/l10n/pt_PT.php b/apps/files_encryption/l10n/pt_PT.php
index d6d3c260363..9a1963953e3 100644
--- a/apps/files_encryption/l10n/pt_PT.php
+++ b/apps/files_encryption/l10n/pt_PT.php
@@ -7,8 +7,11 @@ $TRANSLATIONS = array(
"Password successfully changed." => "Password alterada com sucesso.",
"Could not change the password. Maybe the old password was not correct." => "Não foi possivel alterar a password. Possivelmente a password antiga não está correcta.",
"Could not update the private key password. Maybe the old password was not correct." => "Não foi possível alterar a chave. Possivelmente a password antiga não está correcta.",
+"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." => "Não foi possível desencriptar este ficheiro, possivelmente é um ficheiro partilhado. Peça ao proprietário do ficheiro para voltar a partilhar o ficheiro consigo.",
+"Unknown error please check your system settings or contact your administrator" => "Erro desconhecido. Verifique por favor as definições do sistema ou contacte o seu administrador",
"Missing requirements." => "Faltam alguns requisitos.",
"Following users are not set up for encryption:" => "Os utilizadores seguintes não estão marcados para cifragem:",
+"Go directly to your " => "Ir directamente para o seu",
"personal settings" => "configurações personalizadas ",
"Encryption" => "Encriptação",
"Enable recovery key (allow to recover users files in case of password loss):" => "Active a chave de recuperação (permite recuperar os ficheiros no caso de perda da password):",
diff --git a/apps/files_encryption/l10n/sk_SK.php b/apps/files_encryption/l10n/sk_SK.php
index 5fcd0a9f060..53ee2bc0303 100644
--- a/apps/files_encryption/l10n/sk_SK.php
+++ b/apps/files_encryption/l10n/sk_SK.php
@@ -16,6 +16,7 @@ $TRANSLATIONS = array(
"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." => "Prosím uistite sa, že PHP verzie 5.3.3 alebo novšej je nainštalované a tiež, že OpenSSL knižnica spolu z PHP rozšírením je povolená a konfigurovaná správne. Nateraz bola aplikácia šifrovania zablokovaná.",
"Following users are not set up for encryption:" => "Nasledujúci používatelia nie sú nastavení pre šifrovanie:",
"Initial encryption started... This can take some time. Please wait." => "Počiatočné šifrovanie započalo ... To môže nejakú dobu trvať. Čakajte prosím.",
+"Initial encryption running... Please try again later." => "Počiatočné šifrovanie beží... Skúste to neskôr znovu.",
"Go directly to your " => "Choďte priamo do vášho",
"personal settings" => "osobné nastavenia",
"Encryption" => "Šifrovanie",
diff --git a/apps/files_encryption/l10n/zh_TW.php b/apps/files_encryption/l10n/zh_TW.php
index 390e6aff8c6..84146437ac0 100644
--- a/apps/files_encryption/l10n/zh_TW.php
+++ b/apps/files_encryption/l10n/zh_TW.php
@@ -15,6 +15,8 @@ $TRANSLATIONS = array(
"Missing requirements." => "遺失必要條件。",
"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "請確認已安裝 PHP 5.3.3 或是更新的版本以及 OpenSSL 也一併安裝在 PHP extension 裡面並啟用及設置完成。現在,加密功能是停用的。",
"Following users are not set up for encryption:" => "以下的使用者無法設定加密:",
+"Initial encryption started... This can take some time. Please wait." => "加密初始已啟用...這個需要一些時間。請稍等。",
+"Initial encryption running... Please try again later." => "加密初始執行中...請晚點再試。",
"Go directly to your " => "直接到您的",
"personal settings" => "個人設定",
"Encryption" => "加密",
diff --git a/apps/files_encryption/lib/util.php b/apps/files_encryption/lib/util.php
index b86815021a8..6372ab31b6e 100644
--- a/apps/files_encryption/lib/util.php
+++ b/apps/files_encryption/lib/util.php
@@ -970,33 +970,6 @@ class Util {
}
/**
- * @brief get path of a file.
- * @param int $fileId id of the file
- * @return string path of the file
- */
- public static function fileIdToPath($fileId) {
-
- $sql = 'SELECT `path` FROM `*PREFIX*filecache` WHERE `fileid` = ?';
-
- $query = \OCP\DB::prepare($sql);
-
- $result = $query->execute(array($fileId));
-
- $path = false;
- if (\OCP\DB::isError($result)) {
- \OCP\Util::writeLog('Encryption library', \OC_DB::getErrorMessage($result), \OCP\Util::ERROR);
- } else {
- $row = $result->fetchRow();
- if ($row) {
- $path = substr($row['path'], strlen('files'));
- }
- }
-
- return $path;
-
- }
-
- /**
* @brief Filter an array of UIDs to return only ones ready for sharing
* @param array $unfilteredUsers users to be checked for sharing readiness
* @return array as multi-dimensional array. keys: ready, unready
@@ -1398,7 +1371,7 @@ class Util {
* @param string $dir relative to the users files folder
* @return array with list of files relative to the users files folder
*/
- public function getAllFiles($dir) {
+ public function getAllFiles($dir, $mountPoint = '') {
$result = array();
$dirList = array($dir);
@@ -1408,11 +1381,13 @@ class Util {
$this->userFilesDir . '/' . $dir));
foreach ($content as $c) {
- $usersPath = isset($c['usersPath']) ? $c['usersPath'] : $c['path'];
+ // getDirectoryContent() returns the paths relative to the mount points, so we need
+ // to re-construct the complete path
+ $path = ($mountPoint !== '') ? $mountPoint . '/' . $c['path'] : $c['path'];
if ($c['type'] === 'dir') {
- $dirList[] = substr($usersPath, strlen("files"));
+ $dirList[] = substr($path, strlen("files"));
} else {
- $result[] = substr($usersPath, strlen("files"));
+ $result[] = substr($path, strlen("files"));
}
}
@@ -1422,54 +1397,6 @@ class Util {
}
/**
- * @brief get shares parent.
- * @param int $id of the current share
- * @return array of the parent
- */
- public static function getShareParent($id) {
-
- $sql = 'SELECT `file_target`, `item_type` FROM `*PREFIX*share` WHERE `id` = ?';
-
- $query = \OCP\DB::prepare($sql);
-
- $result = $query->execute(array($id));
-
- $row = array();
- if (\OCP\DB::isError($result)) {
- \OCP\Util::writeLog('Encryption library', \OC_DB::getErrorMessage($result), \OCP\Util::ERROR);
- } else {
- $row = $result->fetchRow();
- }
-
- return $row;
-
- }
-
- /**
- * @brief get shares parent.
- * @param int $id of the current share
- * @return array of the parent
- */
- public static function getParentFromShare($id) {
-
- $sql = 'SELECT `parent` FROM `*PREFIX*share` WHERE `id` = ?';
-
- $query = \OCP\DB::prepare($sql);
-
- $result = $query->execute(array($id));
-
- $row = array();
- if (\OCP\DB::isError($result)) {
- \OCP\Util::writeLog('Encryption library', \OC_DB::getErrorMessage($result), \OCP\Util::ERROR);
- } else {
- $row = $result->fetchRow();
- }
-
- return $row;
-
- }
-
- /**
* @brief get owner of the shared files.
* @param $id
* @internal param int $Id of a share
@@ -1711,23 +1638,6 @@ class Util {
}
/**
- * Get the path including the storage mount point
- * @param int $id
- * @return string the path including the mount point like AmazonS3/folder/file.txt
- */
- public function getPathWithMountPoint($id) {
- list($storage, $internalPath) = \OC\Files\Cache\Cache::getById($id);
- $mount = \OC\Files\Filesystem::getMountByStorageId($storage);
- $mountPoint = $mount[0]->getMountPoint();
- $path = \OC\Files\Filesystem::normalizePath($mountPoint . '/' . $internalPath);
-
- // reformat the path to be relative e.g. /user/files/folder becomes /folder/
- $relativePath = \OCA\Encryption\Helper::stripUserFilesPath($path);
-
- return $relativePath;
- }
-
- /**
* @brief check if the file is stored on a system wide mount point
* @param $path relative to /data/user with leading '/'
* @return boolean
diff --git a/apps/files_encryption/tests/hooks.php b/apps/files_encryption/tests/hooks.php
index d0e4b5f732e..047084ca2c1 100644
--- a/apps/files_encryption/tests/hooks.php
+++ b/apps/files_encryption/tests/hooks.php
@@ -219,18 +219,20 @@ class Test_Encryption_Hooks extends \PHPUnit_Framework_TestCase {
\Test_Encryption_Util::loginHelper(\Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER2);
\OC_User::setUserId(\Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER2);
- // user2 has a local file with the same name
+ // user2 update the shared file
$this->user2View->file_put_contents($this->filename, $this->data);
- // check if all keys are generated
- $this->assertTrue($this->rootView->file_exists(
+ // keys should be stored at user1s dir, not in user2s
+ $this->assertFalse($this->rootView->file_exists(
self::TEST_ENCRYPTION_HOOKS_USER2 . '/files_encryption/share-keys/'
. $this->filename . '.' . \Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER2 . '.shareKey'));
- $this->assertTrue($this->rootView->file_exists(
+ $this->assertFalse($this->rootView->file_exists(
self::TEST_ENCRYPTION_HOOKS_USER2 . '/files_encryption/keyfiles/' . $this->filename . '.key'));
// delete the Shared file from user1 in data/user2/files/Shared
- $this->user2View->unlink('/Shared/' . $this->filename);
+ $result = $this->user2View->unlink($this->filename);
+
+ $this->assertTrue($result);
// now keys from user1s home should be gone
$this->assertFalse($this->rootView->file_exists(
@@ -242,26 +244,12 @@ class Test_Encryption_Hooks extends \PHPUnit_Framework_TestCase {
$this->assertFalse($this->rootView->file_exists(
self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keyfiles/' . $this->filename . '.key'));
- // but user2 keys should still exist
- $this->assertTrue($this->rootView->file_exists(
- self::TEST_ENCRYPTION_HOOKS_USER2 . '/files_encryption/share-keys/'
- . $this->filename . '.' . \Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER2 . '.shareKey'));
- $this->assertTrue($this->rootView->file_exists(
- self::TEST_ENCRYPTION_HOOKS_USER2 . '/files_encryption/keyfiles/' . $this->filename . '.key'));
-
// cleanup
- $this->user2View->unlink($this->filename);
-
\Test_Encryption_Util::logoutHelper();
\Test_Encryption_Util::loginHelper(\Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER1);
\OC_User::setUserId(\Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER1);
- // unshare the file
- \OCP\Share::unshare('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_ENCRYPTION_HOOKS_USER2);
-
- $this->user1View->unlink($this->filename);
-
if ($stateFilesTrashbin) {
OC_App::enable('files_trashbin');
}
diff --git a/apps/files_encryption/tests/share.php b/apps/files_encryption/tests/share.php
index 1f57d7cb635..512671c5767 100755
--- a/apps/files_encryption/tests/share.php
+++ b/apps/files_encryption/tests/share.php
@@ -175,7 +175,7 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
// get file contents
$retrievedCryptedFile = $this->view->file_get_contents(
- '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files/Shared/' . $this->filename);
+ '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files/' . $this->filename);
// check if data is the same as we previously written
$this->assertEquals($this->dataShort, $retrievedCryptedFile);
@@ -213,14 +213,14 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
function testReShareFile($withTeardown = true) {
$this->testShareFile(false);
- // login as user1
+ // login as user2
\Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2);
// get the file info
$fileInfo = $this->view->getFileInfo(
- '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files/Shared/' . $this->filename);
+ '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files/' . $this->filename);
- // share the file with user2
+ // share the file with user3
\OCP\Share::shareItem('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER3, OCP\PERMISSION_ALL);
// login as admin
@@ -236,7 +236,7 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
// get file contents
$retrievedCryptedFile = $this->view->file_get_contents(
- '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER3 . '/files/Shared/' . $this->filename);
+ '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER3 . '/files/' . $this->filename);
// check if data is the same as previously written
$this->assertEquals($this->dataShort, $retrievedCryptedFile);
@@ -333,7 +333,7 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
// get file contents
$retrievedCryptedFile = $this->view->file_get_contents(
- '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files/Shared' . $this->folder1
+ '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files/' . $this->folder1
. $this->subfolder . $this->subsubfolder . '/' . $this->filename);
// check if data is the same
@@ -376,7 +376,7 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
function testReShareFolder($withTeardown = true) {
$fileInfoFolder1 = $this->testShareFolder(false);
- // login as user1
+ // login as user2
\Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2);
// disable encryption proxy to prevent recursive calls
@@ -385,7 +385,7 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
// get the file info from previous created folder
$fileInfoSubFolder = $this->view->getFileInfo(
- '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files/Shared' . $this->folder1
+ '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files/' . $this->folder1
. $this->subfolder);
// check if we have a valid file info
@@ -394,24 +394,24 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
// re-enable the file proxy
\OC_FileProxy::$enabled = $proxyStatus;
- // share the file with user2
+ // share the file with user3
\OCP\Share::shareItem('folder', $fileInfoSubFolder['fileid'], \OCP\Share::SHARE_TYPE_USER, \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER3, OCP\PERMISSION_ALL);
// login as admin
\Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1);
- // check if share key for user2 exists
+ // check if share key for user3 exists
$this->assertTrue($this->view->file_exists(
'/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/share-keys' . $this->folder1
. $this->subfolder . $this->subsubfolder . '/'
. $this->filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER3 . '.shareKey'));
- // login as user2
+ // login as user3
\Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER3);
// get file contents
$retrievedCryptedFile = $this->view->file_get_contents(
- '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER3 . '/files/Shared' . $this->subfolder
+ '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER3 . '/files/' . $this->subfolder
. $this->subsubfolder . '/' . $this->filename);
// check if data is the same
@@ -419,7 +419,7 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
// get the file info
$fileInfo = $this->view->getFileInfo(
- '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER3 . '/files/Shared' . $this->subfolder
+ '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER3 . '/files/' . $this->subfolder
. $this->subsubfolder . '/' . $this->filename);
// check if we have fileInfos
@@ -442,7 +442,7 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
// get file contents
$retrievedCryptedFile = $this->view->file_get_contents(
- '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER4 . '/files/Shared/' . $this->filename);
+ '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER4 . '/files/' . $this->filename);
// check if data is the same
$this->assertEquals($this->dataShort, $retrievedCryptedFile);
@@ -624,7 +624,7 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
// get file contents
$retrievedCryptedFile = $this->view->file_get_contents(
- '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER3 . '/files/Shared/' . $this->filename);
+ '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER3 . '/files/' . $this->filename);
// check if data is the same as we previously written
$this->assertEquals($this->dataShort, $retrievedCryptedFile);
@@ -676,6 +676,7 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
// enable recovery for admin
$this->assertTrue($util->setRecoveryForUser(1));
+ $util->addRecoveryKeys();
// create folder structure
$this->view->mkdir('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files' . $this->folder1);
@@ -981,7 +982,7 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
// share the file
\OCP\Share::shareItem('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2, OCP\PERMISSION_ALL);
- // check if share key for user2exists
+ // check if share key for user2 exists
$this->assertTrue($this->view->file_exists(
'/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/share-keys/'
. $this->filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey'));
@@ -990,31 +991,29 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
// login as user2
\Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2);
- $this->assertTrue($this->view->file_exists('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files/Shared/' . $this->filename));
+ $this->assertTrue($this->view->file_exists('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files/' . $this->filename));
// get file contents
$retrievedCryptedFile = $this->view->file_get_contents(
- '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files/Shared/' . $this->filename);
+ '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files/' . $this->filename);
// check if data is the same as we previously written
$this->assertEquals($this->dataShort, $retrievedCryptedFile);
- // move the file out of the shared folder
- $this->view->rename('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files/Shared/' . $this->filename,
- '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files/' . $this->filename);
+ // move the file to a subfolder
+ $this->view->rename('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files/' . $this->filename,
+ '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files/' . $this->folder1 . $this->filename);
// check if we can read the moved file
$retrievedRenamedFile = $this->view->file_get_contents(
- '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files/' . $this->filename);
+ '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files/' . $this->folder1 . $this->filename);
// check if data is the same as we previously written
$this->assertEquals($this->dataShort, $retrievedRenamedFile);
- // the owners file should be deleted
- $this->assertFalse($this->view->file_exists('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename));
-
// cleanup
- $this->view->unlink('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files/' . $this->filename);
+ \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1);
+ $this->view->unlink('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename);
}
}
diff --git a/apps/files_encryption/tests/util.php b/apps/files_encryption/tests/util.php
index 55a056613e4..a29ef831a52 100755
--- a/apps/files_encryption/tests/util.php
+++ b/apps/files_encryption/tests/util.php
@@ -524,8 +524,8 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase {
\OC_Util::tearDownFS();
\OC_User::setUserId('');
\OC\Files\Filesystem::tearDown();
- \OC_Util::setupFS($user);
\OC_User::setUserId($user);
+ \OC_Util::setupFS($user);
$params['uid'] = $user;
$params['password'] = $password;
diff --git a/apps/files_external/l10n/es_AR.php b/apps/files_external/l10n/es_AR.php
index f184dbdb7d8..9bcff39f018 100644
--- a/apps/files_external/l10n/es_AR.php
+++ b/apps/files_external/l10n/es_AR.php
@@ -5,6 +5,7 @@ $TRANSLATIONS = array(
"Grant access" => "Permitir acceso",
"Please provide a valid Dropbox app key and secret." => "Por favor, proporcioná un secreto y una contraseña válida para la aplicación Dropbox.",
"Error configuring Google Drive storage" => "Error al configurar el almacenamiento de Google Drive",
+"Saved" => "Guardado",
"External Storage" => "Almacenamiento externo",
"Folder name" => "Nombre de la carpeta",
"External storage" => "Almacenamiento externo",
diff --git a/apps/files_external/l10n/es_CL.php b/apps/files_external/l10n/es_CL.php
new file mode 100644
index 00000000000..f52482cad46
--- /dev/null
+++ b/apps/files_external/l10n/es_CL.php
@@ -0,0 +1,5 @@
+<?php
+$TRANSLATIONS = array(
+"Folder name" => "Nombre del directorio"
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_external/l10n/et_EE.php b/apps/files_external/l10n/et_EE.php
index 0589d9fd518..4da749b155b 100644
--- a/apps/files_external/l10n/et_EE.php
+++ b/apps/files_external/l10n/et_EE.php
@@ -6,6 +6,11 @@ $TRANSLATIONS = array(
"Please provide a valid Dropbox app key and secret." => "Palun sisesta korrektne Dropboxi rakenduse võti ja salasõna.",
"Error configuring Google Drive storage" => "Viga Google Drive'i salvestusruumi seadistamisel",
"Saved" => "Salvestatud",
+"<b>Note:</b> " => "<b>Märkus:</b>",
+" and " => "ja",
+"<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." => "<b>Märkus:</b> cURL tugi puudub PHP paigalduses. FTP %s hoidla ühendamine pole võimalik. Palu oma süsteemihalduril paigaldata cURL tugi.",
+"<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." => "<b>Märkus:</b> FTP tugi puudub PHP paigalduses. FTP %s hoidla ühendamine pole võimalik. Palu oma süsteemihalduril paigaldata FTP tugi.",
+"<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." => "<b>Märkus:</b> \"%s\" pole paigaldatud. Hoidla %s ühendamine pole võimalik. Palu oma süsteemihalduril paigaldata vajalik tugi.",
"External Storage" => "Väline salvestuskoht",
"Folder name" => "Kausta nimi",
"External storage" => "Väline andmehoidla",
diff --git a/apps/files_external/l10n/ia.php b/apps/files_external/l10n/ia.php
index 47b0f89b8b5..1873f4ad6fe 100644
--- a/apps/files_external/l10n/ia.php
+++ b/apps/files_external/l10n/ia.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
+"Folder name" => "Nomine de dossier",
"Groups" => "Gruppos",
"Users" => "Usatores",
"Delete" => "Deler"
diff --git a/apps/files_external/l10n/sk_SK.php b/apps/files_external/l10n/sk_SK.php
index de32fb5ffb1..96f6241e5fb 100644
--- a/apps/files_external/l10n/sk_SK.php
+++ b/apps/files_external/l10n/sk_SK.php
@@ -6,17 +6,25 @@ $TRANSLATIONS = array(
"Please provide a valid Dropbox app key and secret." => "Zadajte platný kľúč aplikácie a heslo Dropbox",
"Error configuring Google Drive storage" => "Chyba pri konfigurácii úložiska Google drive",
"Saved" => "Uložené",
+"<b>Note:</b> " => "<b>Poznámka:</b> ",
+" and " => "a",
+"<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." => "<b>Poznámka:</b> cURL podpora v PHP nie je zapnutá alebo nainštalovaná. Pripojenie %s nie je možné. Požiadajte správcu systému, aby ju nainštaloval.",
+"<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." => "<b>Poznámka:</b> FTP podpora v PHP nie je zapnutá alebo nainštalovaná. Pripojenie %s nie je možné. Požiadajte správcu systému, aby ju nainštaloval.",
+"<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." => "<b>Poznámka:</b> \"%s\" nie je nainštalovaná. Pripojenie %s nie je možné. Požiadajte správcu systému, aby ju nainštaloval.",
"External Storage" => "Externé úložisko",
"Folder name" => "Názov priečinka",
"External storage" => "Externé úložisko",
"Configuration" => "Nastavenia",
"Options" => "Možnosti",
+"Available for" => "K dispozícii pre",
"Add storage" => "Pridať úložisko",
+"No user or group" => "Žiadny používateľ alebo skupina",
"All Users" => "Všetci používatelia",
"Groups" => "Skupiny",
"Users" => "Používatelia",
"Delete" => "Zmazať",
"Enable User External Storage" => "Povoliť externé úložisko",
+"Allow users to mount the following external storage" => "Povoliť používateľom pripojiť tieto externé úložiská",
"SSL root certificates" => "Koreňové SSL certifikáty",
"Import Root Certificate" => "Importovať koreňový certifikát"
);
diff --git a/apps/files_external/l10n/sv.php b/apps/files_external/l10n/sv.php
index 2992460d283..761e8f880c1 100644
--- a/apps/files_external/l10n/sv.php
+++ b/apps/files_external/l10n/sv.php
@@ -8,9 +8,9 @@ $TRANSLATIONS = array(
"Saved" => "Sparad",
"<b>Note:</b> " => "<b> OBS: </ b>",
" and " => "och",
-"<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." => "<b> OBS: </ b> cURL stöd i PHP inte är aktiverat eller installeras. Montering av %s är inte möjlig. Be din systemadministratör för att installera det.",
-"<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." => "<b> OBS: </ b> Den FTP-stöd i PHP inte är aktiverat eller installeras. Montering av %s är inte möjlig. Be din systemadministratör för att installera det.",
-"<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." => "<b> OBS: </ b> \"%s\" är inte installerat. Montering av %s är inte möjlig. Be din systemadministratör för att installera det.",
+"<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." => "<b> OBS: </ b> cURL stöd i PHP inte är aktiverat eller installeras. Montering av %s är inte möjlig. Be din systemadministratör att installera det.",
+"<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." => "<b> OBS: </ b> Den FTP-stöd i PHP inte är aktiverat eller installeras. Montering av %s är inte möjlig. Be din systemadministratör att installera det.",
+"<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." => "<b> OBS: </ b> \"%s\" är inte installerat. Montering av %s är inte möjlig. Be din systemadministratör att installera det.",
"External Storage" => "Extern lagring",
"Folder name" => "Mappnamn",
"External storage" => "Extern lagring",
diff --git a/apps/files_external/l10n/zh_TW.php b/apps/files_external/l10n/zh_TW.php
index ac480e405fb..9a99a12aaaf 100644
--- a/apps/files_external/l10n/zh_TW.php
+++ b/apps/files_external/l10n/zh_TW.php
@@ -5,6 +5,7 @@ $TRANSLATIONS = array(
"Grant access" => "允許存取",
"Please provide a valid Dropbox app key and secret." => "請提供有效的 Dropbox app key 和 app secret 。",
"Error configuring Google Drive storage" => "設定 Google Drive 儲存時發生錯誤",
+"Saved" => "已儲存",
"External Storage" => "外部儲存",
"Folder name" => "資料夾名稱",
"External storage" => "外部儲存",
diff --git a/apps/files_external/lib/config.php b/apps/files_external/lib/config.php
index 71f6ae78878..99eca2f38cf 100755
--- a/apps/files_external/lib/config.php
+++ b/apps/files_external/lib/config.php
@@ -373,8 +373,8 @@ class OC_Mount_Config {
$isPersonal = false) {
$backends = self::getBackends();
$mountPoint = OC\Files\Filesystem::normalizePath($mountPoint);
- if ($mountPoint === '' || $mountPoint === '/' || $mountPoint == '/Shared') {
- // can't mount at root or "Shared" folder
+ if ($mountPoint === '' || $mountPoint === '/') {
+ // can't mount at root folder
return false;
}
diff --git a/apps/files_external/tests/mountconfig.php b/apps/files_external/tests/mountconfig.php
index c89874c94d5..1921ec76af3 100644
--- a/apps/files_external/tests/mountconfig.php
+++ b/apps/files_external/tests/mountconfig.php
@@ -128,9 +128,6 @@ class Test_Mount_Config extends \PHPUnit_Framework_TestCase {
$isPersonal = false;
$this->assertFalse(OC_Mount_Config::addMountPoint('', $storageClass, array(), $mountType, $applicable, $isPersonal));
$this->assertFalse(OC_Mount_Config::addMountPoint('/', $storageClass, array(), $mountType, $applicable, $isPersonal));
- $this->assertFalse(OC_Mount_Config::addMountPoint('Shared', $storageClass, array(), $mountType, $applicable, $isPersonal));
- $this->assertFalse(OC_Mount_Config::addMountPoint('/Shared', $storageClass, array(), $mountType, $applicable, $isPersonal));
-
}
/**
@@ -488,7 +485,7 @@ class Test_Mount_Config extends \PHPUnit_Framework_TestCase {
'root' => 'someroot'
);
- // add mount point as "test" user
+ // add mount point as "test" user
$this->assertTrue(
OC_Mount_Config::addMountPoint(
'/ext',
diff --git a/apps/files_sharing/appinfo/app.php b/apps/files_sharing/appinfo/app.php
index 217bc005faf..0ef34578117 100644
--- a/apps/files_sharing/appinfo/app.php
+++ b/apps/files_sharing/appinfo/app.php
@@ -17,6 +17,4 @@ OCP\Util::addScript('files_sharing', 'share');
\OC_Hook::connect('OC_Filesystem', 'post_delete', '\OC\Files\Cache\Shared_Updater', 'postDeleteHook');
\OC_Hook::connect('OC_Filesystem', 'delete', '\OC\Files\Cache\Shared_Updater', 'deleteHook');
\OC_Hook::connect('OC_Filesystem', 'post_rename', '\OC\Files\Cache\Shared_Updater', 'renameHook');
-\OC_Hook::connect('OCP\Share', 'post_shared', '\OC\Files\Cache\Shared_Updater', 'shareHook');
-\OC_Hook::connect('OCP\Share', 'pre_unshare', '\OC\Files\Cache\Shared_Updater', 'shareHook');
\OC_Hook::connect('OC_Appconfig', 'post_set_value', '\OCA\Files\Share\Maintainer', 'configChangeHook');
diff --git a/apps/files_sharing/appinfo/update.php b/apps/files_sharing/appinfo/update.php
index ab32108ea25..bc8cda42313 100644
--- a/apps/files_sharing/appinfo/update.php
+++ b/apps/files_sharing/appinfo/update.php
@@ -1,76 +1,77 @@
<?php
+
$installedVersion = OCP\Config::getAppValue('files_sharing', 'installed_version');
-if (version_compare($installedVersion, '0.3', '<')) {
- $update_error = false;
- $query = OCP\DB::prepare('SELECT * FROM `*PREFIX*sharing`');
+if (version_compare($installedVersion, '0.4', '<')) {
+ removeSharedFolder();
+}
+
+// clean up oc_share table from files which are no longer exists
+if (version_compare($installedVersion, '0.3.5.6', '<')) {
+ \OC\Files\Cache\Shared_Updater::fixBrokenSharesOnAppUpdate();
+}
+
+
+/**
+ * update script for the removal of the logical "Shared" folder, we create physical "Shared" folder and
+ * update the users file_target so that it doesn't make any difference for the user
+ * @note parameters are just for testing, please ignore them
+ */
+function removeSharedFolder($mkdirs = true, $chunkSize = 99) {
+ $query = OCP\DB::prepare('SELECT * FROM `*PREFIX*share`');
$result = $query->execute();
- $groupShares = array();
- //we need to set up user backends, otherwise creating the shares will fail with "because user does not exist"
+ $view = new \OC\Files\View('/');
+ $users = array();
+ $shares = array();
+ //we need to set up user backends
OC_User::useBackend(new OC_User_Database());
OC_Group::useBackend(new OC_Group_Database());
OC_App::loadApps(array('authentication'));
- $rootView = new \OC\Files\View('');
+ //we need to set up user backends, otherwise creating the shares will fail with "because user does not exist"
while ($row = $result->fetchRow()) {
- $meta = $rootView->getFileInfo($$row['source']);
- $itemSource = $meta['fileid'];
- if ($itemSource != -1) {
- $file = $meta;
- if ($file['mimetype'] == 'httpd/unix-directory') {
- $itemType = 'folder';
- } else {
- $itemType = 'file';
- }
- if ($row['permissions'] == 0) {
- $permissions = OCP\PERMISSION_READ | OCP\PERMISSION_SHARE;
- } else {
- $permissions = OCP\PERMISSION_READ | OCP\PERMISSION_UPDATE | OCP\PERMISSION_SHARE;
- if ($itemType == 'folder') {
- $permissions |= OCP\PERMISSION_CREATE;
- }
- }
- $pos = strrpos($row['uid_shared_with'], '@');
- if ($pos !== false && OC_Group::groupExists(substr($row['uid_shared_with'], $pos + 1))) {
- $shareType = OCP\Share::SHARE_TYPE_GROUP;
- $shareWith = substr($row['uid_shared_with'], 0, $pos);
- if (isset($groupShares[$shareWith][$itemSource])) {
- continue;
- } else {
- $groupShares[$shareWith][$itemSource] = true;
+ //collect all user shares
+ if ((int)$row['share_type'] === 0 && ($row['item_type'] === 'file' || $row['item_type'] === 'folder')) {
+ $users[] = $row['share_with'];
+ $shares[$row['id']] = $row['file_target'];
+ } else if ((int)$row['share_type'] === 1 && ($row['item_type'] === 'file' || $row['item_type'] === 'folder')) {
+ //collect all group shares
+ $users = array_merge($users, \OC_group::usersInGroup($row['share_with']));
+ $shares[$row['id']] = $row['file_target'];
+ } else if ((int)$row['share_type'] === 2) {
+ $shares[$row['id']] = $row['file_target'];
+ }
+ }
+
+ $unique_users = array_unique($users);
+
+ if (!empty($unique_users) && !empty($shares)) {
+
+ // create folder Shared for each user
+
+ if ($mkdirs) {
+ foreach ($unique_users as $user) {
+ \OC\Files\Filesystem::initMountPoints($user);
+ if (!$view->file_exists('/' . $user . '/files/Shared')) {
+ $view->mkdir('/' . $user . '/files/Shared');
}
- } else if ($row['uid_shared_with'] == 'public') {
- $shareType = OCP\Share::SHARE_TYPE_LINK;
- $shareWith = null;
- } else {
- $shareType = OCP\Share::SHARE_TYPE_USER;
- $shareWith = $row['uid_shared_with'];
}
- OCP\JSON::checkUserExists($row['uid_owner']);
- OC_User::setUserId($row['uid_owner']);
- //we need to setup the filesystem for the user, otherwise OC_FileSystem::getRoot will fail and break
- OC_Util::setupFS($row['uid_owner']);
- try {
- OCP\Share::shareItem($itemType, $itemSource, $shareType, $shareWith, $permissions);
- }
- catch (Exception $e) {
- $update_error = true;
- OCP\Util::writeLog('files_sharing',
- 'Upgrade Routine: Skipping sharing "'.$row['source'].'" to "'.$shareWith
- .'" (error is "'.$e->getMessage().'")',
- OCP\Util::WARN);
+ }
+
+ $chunkedShareList = array_chunk($shares, $chunkSize, true);
+
+ foreach ($chunkedShareList as $subList) {
+
+ $statement = "UPDATE `*PREFIX*share` SET `file_target` = CASE `id` ";
+ //update share table
+ $ids = implode(',', array_keys($subList));
+ foreach ($subList as $id => $target) {
+ $statement .= "WHEN " . $id . " THEN '/Shared" . $target . "' ";
}
- OC_Util::tearDownFS();
+ $statement .= ' END WHERE `id` IN (' . $ids . ')';
+
+ $query = OCP\DB::prepare($statement);
+
+ $query->execute(array());
}
- }
- OC_User::setUserId(null);
- if ($update_error) {
- OCP\Util::writeLog('files_sharing', 'There were some problems upgrading the sharing of files', OCP\Util::ERROR);
- }
- // NOTE: Let's drop the table after more testing
-// $query = OCP\DB::prepare('DROP TABLE `*PREFIX*sharing`');
-// $query->execute();
-}
-// clean up oc_share table from files which are no longer exists
-if (version_compare($installedVersion, '0.3.5.6', '<')) {
- \OC\Files\Cache\Shared_Updater::fixBrokenSharesOnAppUpdate();
+ }
}
diff --git a/apps/files_sharing/appinfo/version b/apps/files_sharing/appinfo/version
index 8f91d33378e..bd73f47072b 100644
--- a/apps/files_sharing/appinfo/version
+++ b/apps/files_sharing/appinfo/version
@@ -1 +1 @@
-0.3.5.6
+0.4
diff --git a/apps/files_sharing/l10n/bg_BG.php b/apps/files_sharing/l10n/bg_BG.php
index 4fe5ba6b16f..37e2ca33370 100644
--- a/apps/files_sharing/l10n/bg_BG.php
+++ b/apps/files_sharing/l10n/bg_BG.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
-"Password" => "Парола"
+"Password" => "Парола",
+"shared by %s" => "споделено от %s"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/lib/api.php b/apps/files_sharing/lib/api.php
index de3c1cd2630..438d3cc4ba3 100644
--- a/apps/files_sharing/lib/api.php
+++ b/apps/files_sharing/lib/api.php
@@ -184,7 +184,6 @@ class Api {
$receivedFrom = \OCP\Share::getItemSharedWithBySource($itemType, $file['fileid']);
reset($share);
$key = key($share);
- $share[$key]['path'] = self::correctPath($share[$key]['path'], $path);
if ($receivedFrom) {
$share[$key]['received_from'] = $receivedFrom['uid_owner'];
$share[$key]['received_from_displayname'] = \OCP\User::getDisplayName($receivedFrom['uid_owner']);
@@ -531,15 +530,4 @@ class Api {
}
- /**
- * @brief make sure that the path has the correct root
- *
- * @param string $path path returned from the share API
- * @param string $folder current root folder
- * @return string the correct path
- */
- protected static function correctPath($path, $folder) {
- return \OC_Filesystem::normalizePath('/' . $folder . '/' . basename($path));
- }
-
}
diff --git a/apps/files_sharing/lib/cache.php b/apps/files_sharing/lib/cache.php
index eeb62c3cce2..67a0410ef76 100644
--- a/apps/files_sharing/lib/cache.php
+++ b/apps/files_sharing/lib/cache.php
@@ -2,8 +2,9 @@
/**
* ownCloud
*
- * @author Michael Gapczynski
- * @copyright 2012 Michael Gapczynski mtgap@owncloud.com
+ * @author Bjoern Schiessle, Michael Gapczynski
+ * @copyright 2012 Michael Gapczynski <mtgap@owncloud.com>
+ * 2014 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
@@ -46,12 +47,15 @@ class Shared_Cache extends Cache {
* @return \OC\Files\Cache\Cache
*/
private function getSourceCache($target) {
- $source = \OC_Share_Backend_File::getSource($target);
+ if ($target === false || $target === $this->storage->getMountPoint()) {
+ $target = '';
+ }
+ $source = \OC_Share_Backend_File::getSource($target, $this->storage->getMountPoint(), $this->storage->getItemType());
if (isset($source['path']) && isset($source['fileOwner'])) {
\OC\Files\Filesystem::initMountPoints($source['fileOwner']);
- $mount = \OC\Files\Filesystem::getMountByNumericId($source['storage']);
- if (is_array($mount)) {
- $fullPath = $mount[key($mount)]->getMountPoint() . $source['path'];
+ $mounts = \OC\Files\Filesystem::getMountByNumericId($source['storage']);
+ if (is_array($mounts) and count($mounts)) {
+ $fullPath = $mounts[0]->getMountPoint() . $source['path'];
list($storage, $internalPath) = \OC\Files\Filesystem::resolvePath($fullPath);
if ($storage) {
$this->files[$target] = $internalPath;
@@ -80,23 +84,28 @@ class Shared_Cache extends Cache {
* @return array
*/
public function get($file) {
- if ($file == '') {
- $data = \OCP\Share::getItemsSharedWith('file', \OC_Share_Backend_File::FORMAT_FILE_APP_ROOT);
- $etag = \OCP\Config::getUserValue(\OCP\User::getUser(), 'files_sharing', 'etag');
- if (!isset($etag)) {
- $etag = $this->storage->getETag('');
- \OCP\Config::setUserValue(\OCP\User::getUser(), 'files_sharing', 'etag', $etag);
- }
- $data['etag'] = $etag;
- return $data;
- } else if (is_string($file)) {
+ if (is_string($file)) {
if ($cache = $this->getSourceCache($file)) {
- return $cache->get($this->files[$file]);
+ $path = 'files' . $this->storage->getMountPoint();
+ $path .= ($file !== '') ? '/' . $file : '';
+ $data = $cache->get($this->files[$file]);
+ $data['displayname_owner'] = \OC_User::getDisplayName($this->storage->getSharedFrom());
+ $data['path'] = $path;
+ if ($file === '') {
+ $data['is_share_mount_point'] = true;
+ }
+ return $data;
}
} else {
+ // if we are at the root of the mount point we want to return the
+ // cache information for the source item
+ if (!is_int($file) || $file === 0) {
+ $file = $this->storage->getSourceId();
+ $mountPoint = $this->storage->getMountPoint();
+ }
$query = \OC_DB::prepare(
'SELECT `fileid`, `storage`, `path`, `parent`, `name`, `mimetype`, `mimepart`,'
- . ' `size`, `mtime`, `encrypted`, `unencrypted_size`'
+ . ' `size`, `mtime`, `encrypted`, `unencrypted_size`, `storage_mtime`, `etag`'
. ' FROM `*PREFIX*filecache` WHERE `fileid` = ?');
$result = $query->execute(array($file));
$data = $result->fetchRow();
@@ -115,6 +124,10 @@ class Shared_Cache extends Cache {
} else {
$data['size'] = (int)$data['size'];
}
+ if (isset($mountPoint)) {
+ $data['path'] = 'files/' . $mountPoint;
+ $data['is_share_mount_point'] = true;
+ }
return $data;
}
return false;
@@ -127,28 +140,26 @@ class Shared_Cache extends Cache {
* @return array
*/
public function getFolderContents($folder) {
- if ($folder == '') {
- $files = \OCP\Share::getItemsSharedWith('file', \OC_Share_Backend_File::FORMAT_GET_FOLDER_CONTENTS);
- foreach ($files as &$file) {
- $file['mimetype'] = $this->getMimetype($file['mimetype']);
- $file['mimepart'] = $this->getMimetype($file['mimepart']);
- $file['usersPath'] = 'files/Shared/' . ltrim($file['path'], '/');
- }
- return $files;
- } else {
- $cache = $this->getSourceCache($folder);
- if ($cache) {
- $parent = $this->storage->getFile($folder);
- $sourceFolderContent = $cache->getFolderContents($this->files[$folder]);
- foreach ($sourceFolderContent as $key => $c) {
- $sourceFolderContent[$key]['usersPath'] = 'files/Shared/' . $folder . '/' . $c['name'];
- $sourceFolderContent[$key]['uid_owner'] = $parent['uid_owner'];
- $sourceFolderContent[$key]['displayname_owner'] = $parent['uid_owner'];
- }
- return $sourceFolderContent;
+ if ($folder === false) {
+ $folder = '';
+ }
+
+ $dir = ($folder !== '') ? $folder . '/' : '';
+
+ $cache = $this->getSourceCache($folder);
+ if ($cache) {
+ $parent = $this->storage->getFile($folder);
+ $sourceFolderContent = $cache->getFolderContents($this->files[$folder]);
+ foreach ($sourceFolderContent as $key => $c) {
+ $sourceFolderContent[$key]['path'] = $dir . $c['name'];
+ $sourceFolderContent[$key]['uid_owner'] = $parent['uid_owner'];
+ $sourceFolderContent[$key]['displayname_owner'] = $parent['uid_owner'];
}
+
+ return $sourceFolderContent;
}
+
return false;
}
@@ -161,9 +172,8 @@ class Shared_Cache extends Cache {
* @return int file id
*/
public function put($file, array $data) {
- if ($file === '' && isset($data['etag'])) {
- return \OCP\Config::setUserValue(\OCP\User::getUser(), 'files_sharing', 'etag', $data['etag']);
- } else if ($cache = $this->getSourceCache($file)) {
+ $file = ($file === false) ? '' : $file;
+ if ($cache = $this->getSourceCache($file)) {
return $cache->put($this->files[$file], $data);
}
return false;
@@ -176,7 +186,11 @@ class Shared_Cache extends Cache {
* @return int
*/
public function getId($file) {
- if ($cache = $this->getSourceCache($file)) {
+ if ($file === false) {
+ return $this->storage->getSourceId();
+ }
+ $cache = $this->getSourceCache($file);
+ if ($cache) {
return $cache->getId($this->files[$file]);
}
return -1;
@@ -201,6 +215,7 @@ class Shared_Cache extends Cache {
* @param string $file
*/
public function remove($file) {
+ $file = ($file === false) ? '' : $file;
if ($cache = $this->getSourceCache($file)) {
$cache->remove($this->files[$file]);
}
@@ -214,7 +229,7 @@ class Shared_Cache extends Cache {
*/
public function move($source, $target) {
if ($cache = $this->getSourceCache($source)) {
- $file = \OC_Share_Backend_File::getSource($target);
+ $file = \OC_Share_Backend_File::getSource($target, $this->storage->getMountPoint(), $this->storage->getItemType());
if ($file && isset($file['path'])) {
$cache->move($this->files[$source], $file['path']);
}
@@ -290,9 +305,6 @@ class Shared_Cache extends Cache {
if ($file['mimetype'] === 'httpd/unix-directory') {
$exploreDirs[] = ltrim($dir . '/' . $file['name'], '/');
} else if (($mimepart && $file['mimepart'] === $mimepart) || ($mimetype && $file['mimetype'] === $mimetype)) {
- // usersPath not reliable
- //$file['path'] = $file['usersPath'];
- $file['path'] = ltrim($dir . '/' . $file['name'], '/');
$result[] = $file;
}
}
@@ -359,6 +371,7 @@ class Shared_Cache extends Cache {
* @return int
*/
public function calculateFolderSize($path, $entry = null) {
+ $path = ($path === false) ? '' : $path;
if ($cache = $this->getSourceCache($path)) {
return $cache->calculateFolderSize($this->files[$path]);
}
@@ -401,7 +414,7 @@ class Shared_Cache extends Cache {
}
/**
- * get the path of a file on this storage by it's id
+ * get the path of a file on this storage relative to the mount point by it's id
*
* @param int $id
* @param string $pathEnd (optional) used internally for recursive calls
@@ -409,8 +422,9 @@ class Shared_Cache extends Cache {
*/
public function getPathById($id, $pathEnd = '') {
// direct shares are easy
- if ($path = $this->getShareById($id)) {
- return $path . $pathEnd;
+ $path = $this->getShareById($id);
+ if (is_string($path)) {
+ return ltrim($pathEnd, '/');
} else {
// if the item is a direct share we try and get the path of the parent and append the name of the item to it
list($parent, $name) = $this->getParentInfo($id);
diff --git a/apps/files_sharing/lib/helper.php b/apps/files_sharing/lib/helper.php
index b602fe3599d..cc1f7d9ffdf 100644
--- a/apps/files_sharing/lib/helper.php
+++ b/apps/files_sharing/lib/helper.php
@@ -2,6 +2,9 @@
namespace OCA\Files_Sharing;
+use OC_Config;
+use PasswordHash;
+
class Helper {
/**
@@ -26,9 +29,6 @@ class Helper {
exit;
}
- $type = $linkItem['item_type'];
- $fileSource = $linkItem['file_source'];
- $shareOwner = $linkItem['uid_owner'];
$rootLinkItem = \OCP\Share::resolveReShare($linkItem);
$path = null;
if (isset($rootLinkItem['uid_owner'])) {
@@ -61,7 +61,6 @@ class Helper {
}
$basePath = $path;
- $rootName = basename($path);
if ($relativePath !== null && \OC\Files\Filesystem::isReadable($basePath . $relativePath)) {
$path .= \OC\Files\Filesystem::normalizePath($relativePath);
@@ -111,4 +110,70 @@ class Helper {
}
return true;
}
+
+ public static function getSharesFromItem($target) {
+ $result = array();
+ $owner = \OC\Files\Filesystem::getOwner($target);
+ \OC\Files\Filesystem::initMountPoints($owner);
+ $info = \OC\Files\Filesystem::getFileInfo($target);
+ $ownerView = new \OC\Files\View('/'.$owner.'/files');
+ if ( $owner != \OCP\User::getUser() ) {
+ $path = $ownerView->getPath($info['fileid']);
+ } else {
+ $path = $target;
+ }
+
+
+ $ids = array();
+ while ($path !== '' && $path !== '.' && $path !== '/') {
+ $info = $ownerView->getFileInfo($path);
+ $ids[] = $info['fileid'];
+ $path = dirname($path);
+ }
+
+ if (!empty($ids)) {
+
+ $idList = array_chunk($ids, 99, true);
+
+ foreach ($idList as $subList) {
+ $statement = "SELECT `share_with`, `share_type`, `file_target` FROM `*PREFIX*share` WHERE `file_source` IN (" . implode(',', $subList) . ") AND `share_type` IN (0, 1, 2)";
+ $query = \OCP\DB::prepare($statement);
+ $r = $query->execute();
+ $result = array_merge($result, $r->fetchAll());
+ }
+ }
+
+ return $result;
+ }
+
+ public static function getUidAndFilename($filename) {
+ $uid = \OC\Files\Filesystem::getOwner($filename);
+ \OC\Files\Filesystem::initMountPoints($uid);
+ if ( $uid != \OCP\User::getUser() ) {
+ $info = \OC\Files\Filesystem::getFileInfo($filename);
+ $ownerView = new \OC\Files\View('/'.$uid.'/files');
+ $filename = $ownerView->getPath($info['fileid']);
+ }
+ return array($uid, $filename);
+ }
+
+ /**
+ * @brief Format a path to be relative to the /user/files/ directory
+ * @param string $path the absolute path
+ * @return string e.g. turns '/admin/files/test.txt' into 'test.txt'
+ */
+ public static function stripUserFilesPath($path) {
+ $trimmed = ltrim($path, '/');
+ $split = explode('/', $trimmed);
+
+ // it is not a file relative to data/user/files
+ if (count($split) < 3 || $split[1] !== 'files') {
+ return false;
+ }
+
+ $sliced = array_slice($split, 2);
+ $relPath = implode('/', $sliced);
+
+ return $relPath;
+ }
}
diff --git a/apps/files_sharing/lib/permissions.php b/apps/files_sharing/lib/permissions.php
index 31b7ac361ae..c3ad63e2fd2 100644
--- a/apps/files_sharing/lib/permissions.php
+++ b/apps/files_sharing/lib/permissions.php
@@ -31,7 +31,9 @@ class Shared_Permissions extends Permissions {
*/
public function get($fileId, $user) {
if ($fileId == -1) {
- return \OCP\PERMISSION_READ;
+ // if we ask for the mount point return -1 so that we can get the correct
+ // permissions by the path, with the root fileId we have no idea which share is meant
+ return -1;
}
$source = \OCP\Share::getItemSharedWithBySource('file', $fileId, \OC_Share_Backend_File::FORMAT_SHARED_STORAGE,
null, true);
diff --git a/apps/files_sharing/lib/share/file.php b/apps/files_sharing/lib/share/file.php
index 5e00050fe1e..c0c9e0c107e 100644
--- a/apps/files_sharing/lib/share/file.php
+++ b/apps/files_sharing/lib/share/file.php
@@ -2,8 +2,9 @@
/**
* ownCloud
*
-* @author Michael Gapczynski
-* @copyright 2012 Michael Gapczynski mtgap@owncloud.com
+* @author Bjoern Schiessle, Michael Gapczynski
+* @copyright 2012 Michael Gapczynski <mtgap@owncloud.com>
+ * 2014 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
@@ -27,6 +28,7 @@ class OC_Share_Backend_File implements OCP\Share_Backend_File_Dependent {
const FORMAT_OPENDIR = 3;
const FORMAT_GET_ALL = 4;
const FORMAT_PERMISSIONS = 5;
+ const FORMAT_TARGET_NAMES = 6;
private $path;
@@ -49,24 +51,37 @@ class OC_Share_Backend_File implements OCP\Share_Backend_File_Dependent {
return false;
}
+ /**
+ * @brief create unique target
+ * @param string $filePath
+ * @param string $shareWith
+ * @param string $exclude
+ * @return string
+ */
public function generateTarget($filePath, $shareWith, $exclude = null) {
$target = '/'.basename($filePath);
- if (isset($exclude)) {
- if ($pos = strrpos($target, '.')) {
- $name = substr($target, 0, $pos);
- $ext = substr($target, $pos);
- } else {
- $name = $target;
- $ext = '';
- }
- $i = 2;
- $append = '';
- while (in_array($name.$append.$ext, $exclude)) {
- $append = ' ('.$i.')';
- $i++;
- }
- $target = $name.$append.$ext;
+
+ // for group shares we return the target right away
+ if ($shareWith === false) {
+ return $target;
+ }
+
+ \OC\Files\Filesystem::initMountPoints($shareWith);
+ $view = new \OC\Files\View('/' . $shareWith . '/files');
+ $excludeList = \OCP\Share::getItemsSharedWithUser('file', $shareWith, self::FORMAT_TARGET_NAMES);
+ if (is_array($exclude)) {
+ $excludeList = array_merge($excludeList, $exclude);
+ }
+
+ $pathinfo = pathinfo($target);
+ $ext = (isset($pathinfo['extension'])) ? '.'.$pathinfo['extension'] : '';
+ $name = $pathinfo['filename'];
+ $i = 2;
+ while ($view->file_exists($target) || in_array($target, $excludeList)) {
+ $target = '/' . $name . ' ('.$i.')' . $ext;
+ $i++;
}
+
return $target;
}
@@ -78,7 +93,7 @@ class OC_Share_Backend_File implements OCP\Share_Backend_File_Dependent {
'path' => $items[key($items)]['path'],
'storage' => $items[key($items)]['storage'],
'permissions' => $items[key($items)]['permissions'],
- 'uid_owner' => $items[key($items)]['uid_owner']
+ 'uid_owner' => $items[key($items)]['uid_owner'],
);
} else if ($format == self::FORMAT_GET_FOLDER_CONTENTS) {
$files = array();
@@ -108,22 +123,6 @@ class OC_Share_Backend_File implements OCP\Share_Backend_File_Dependent {
$files[] = $file;
}
return $files;
- } else if ($format == self::FORMAT_FILE_APP_ROOT) {
- $mtime = 0;
- $size = 0;
- foreach ($items as $item) {
- if ($item['mtime'] > $mtime) {
- $mtime = $item['mtime'];
- }
- $size += (int)$item['size'];
- }
- return array(
- 'fileid' => -1,
- 'name' => 'Shared',
- 'mtime' => $mtime,
- 'mimetype' => 'httpd/unix-directory',
- 'size' => $size
- );
} else if ($format == self::FORMAT_OPENDIR) {
$files = array();
foreach ($items as $item) {
@@ -142,46 +141,60 @@ class OC_Share_Backend_File implements OCP\Share_Backend_File_Dependent {
$filePermissions[$item['file_source']] = $item['permissions'];
}
return $filePermissions;
+ } else if ($format === self::FORMAT_TARGET_NAMES) {
+ $targets = array();
+ foreach ($items as $item) {
+ $targets[] = $item['file_target'];
+ }
+ return $targets;
}
return array();
}
- public static function getSource($target) {
- if ($target == '') {
- return false;
+ /**
+ * @brief resolve reshares to return the correct source item
+ * @param array $source
+ * @return array source item
+ */
+ protected static function resolveReshares($source) {
+ if (isset($source['parent'])) {
+ $parent = $source['parent'];
+ while (isset($parent)) {
+ $query = \OC_DB::prepare('SELECT `parent`, `uid_owner` FROM `*PREFIX*share` WHERE `id` = ?', 1);
+ $item = $query->execute(array($parent))->fetchRow();
+ if (isset($item['parent'])) {
+ $parent = $item['parent'];
+ } else {
+ $fileOwner = $item['uid_owner'];
+ break;
+ }
+ }
+ } else {
+ $fileOwner = $source['uid_owner'];
}
- $target = '/'.$target;
- $target = rtrim($target, '/');
- $pos = strpos($target, '/', 1);
- // Get shared folder name
- if ($pos !== false) {
- $folder = substr($target, 0, $pos);
- $source = \OCP\Share::getItemSharedWith('folder', $folder, \OC_Share_Backend_File::FORMAT_SHARED_STORAGE);
- if ($source) {
- $source['path'] = $source['path'].substr($target, strlen($folder));
+ if (isset($fileOwner)) {
+ $source['fileOwner'] = $fileOwner;
+ } else {
+ \OCP\Util::writeLog('files_sharing', "No owner found for reshare", \OCP\Util::ERROR);
+ }
+
+ return $source;
+ }
+
+ public static function getSource($target, $mountPoint, $itemType) {
+
+ if ($itemType === 'folder') {
+ $source = \OCP\Share::getItemSharedWith('folder', $mountPoint, \OC_Share_Backend_File::FORMAT_SHARED_STORAGE);
+ if ($source && $target !== '') {
+ $source['path'] = $source['path'].'/'.$target;
}
} else {
- $source = \OCP\Share::getItemSharedWith('file', $target, \OC_Share_Backend_File::FORMAT_SHARED_STORAGE);
+ $source = \OCP\Share::getItemSharedWith('file', $mountPoint, \OC_Share_Backend_File::FORMAT_SHARED_STORAGE);
}
if ($source) {
- if (isset($source['parent'])) {
- $parent = $source['parent'];
- while (isset($parent)) {
- $query = \OC_DB::prepare('SELECT `parent`, `uid_owner` FROM `*PREFIX*share` WHERE `id` = ?', 1);
- $item = $query->execute(array($parent))->fetchRow();
- if (isset($item['parent'])) {
- $parent = $item['parent'];
- } else {
- $fileOwner = $item['uid_owner'];
- break;
- }
- }
- } else {
- $fileOwner = $source['uid_owner'];
- }
- $source['fileOwner'] = $fileOwner;
- return $source;
+ return self::resolveReshares($source);
}
+
\OCP\Util::writeLog('files_sharing', 'File source not found for: '.$target, \OCP\Util::DEBUG);
return false;
}
diff --git a/apps/files_sharing/lib/sharedstorage.php b/apps/files_sharing/lib/sharedstorage.php
index b922654e5ec..5e478d5ead8 100644
--- a/apps/files_sharing/lib/sharedstorage.php
+++ b/apps/files_sharing/lib/sharedstorage.php
@@ -2,8 +2,9 @@
/**
* ownCloud
*
- * @author Michael Gapczynski
- * @copyright 2011 Michael Gapczynski mtgap@owncloud.com
+ * @author Bjoern Schiessle, Michael Gapczynski
+ * @copyright 2011 Michael Gapczynski <mtgap@owncloud.com>
+ * 2014 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
@@ -27,15 +28,27 @@ namespace OC\Files\Storage;
*/
class Shared extends \OC\Files\Storage\Common {
- private $sharedFolder;
+ private $share; // the shared resource
private $files = array();
public function __construct($arguments) {
- $this->sharedFolder = $arguments['sharedFolder'];
+ $this->share = $arguments['share'];
}
+ /**
+ * @breif get id of the mount point
+ * @return string
+ */
public function getId() {
- return 'shared::' . $this->sharedFolder;
+ return 'shared::' . $this->getMountPoint();
+ }
+
+ /**
+ * @breif get file cache of the shared item source
+ * @return string
+ */
+ public function getSourceId() {
+ return $this->share['file_source'];
}
/**
@@ -48,14 +61,14 @@ class Shared extends \OC\Files\Storage\Common {
if (!isset($this->files[$target])) {
// Check for partial files
if (pathinfo($target, PATHINFO_EXTENSION) === 'part') {
- $source = \OC_Share_Backend_File::getSource(substr($target, 0, -5));
+ $source = \OC_Share_Backend_File::getSource(substr($target, 0, -5), $this->getMountPoint(), $this->getItemType());
if ($source) {
$source['path'] .= '.part';
// All partial files have delete permission
$source['permissions'] |= \OCP\PERMISSION_DELETE;
}
} else {
- $source = \OC_Share_Backend_File::getSource($target);
+ $source = \OC_Share_Backend_File::getSource($target, $this->getMountPoint(), $this->getItemType());
}
$this->files[$target] = $source;
}
@@ -117,25 +130,15 @@ class Shared extends \OC\Files\Storage\Common {
}
public function opendir($path) {
- if ($path == '' || $path == '/') {
- $files = \OCP\Share::getItemsSharedWith('file', \OC_Share_Backend_Folder::FORMAT_OPENDIR);
- \OC\Files\Stream\Dir::register('shared', $files);
- return opendir('fakedir://shared');
- } else if ($source = $this->getSourcePath($path)) {
- list($storage, $internalPath) = \OC\Files\Filesystem::resolvePath($source);
- return $storage->opendir($internalPath);
- }
- return false;
+ $source = $this->getSourcePath($path);
+ list($storage, $internalPath) = \OC\Files\Filesystem::resolvePath($source);
+ return $storage->opendir($internalPath);
}
public function is_dir($path) {
- if ($path == '' || $path == '/') {
- return true;
- } else if ($source = $this->getSourcePath($path)) {
- list($storage, $internalPath) = \OC\Files\Filesystem::resolvePath($source);
- return $storage->is_dir($internalPath);
- }
- return false;
+ $source = $this->getSourcePath($path);
+ list($storage, $internalPath) = \OC\Files\Filesystem::resolvePath($source);
+ return $storage->is_dir($internalPath);
}
public function is_file($path) {
@@ -180,7 +183,7 @@ class Shared extends \OC\Files\Storage\Common {
public function isCreatable($path) {
if ($path == '') {
- return false;
+ $path = $this->getMountPoint();
}
return ($this->getPermissions($path) & \OCP\PERMISSION_CREATE);
}
@@ -191,21 +194,21 @@ class Shared extends \OC\Files\Storage\Common {
public function isUpdatable($path) {
if ($path == '') {
- return false;
+ $path = $this->getMountPoint();
}
return ($this->getPermissions($path) & \OCP\PERMISSION_UPDATE);
}
public function isDeletable($path) {
if ($path == '') {
- return true;
+ $path = $this->getMountPoint();
}
return ($this->getPermissions($path) & \OCP\PERMISSION_DELETE);
}
public function isSharable($path) {
if ($path == '') {
- return false;
+ $path = $this->getMountPoint();
}
return ($this->getPermissions($path) & \OCP\PERMISSION_SHARE);
}
@@ -221,32 +224,16 @@ class Shared extends \OC\Files\Storage\Common {
}
public function filemtime($path) {
- if ($path == '' || $path == '/') {
- $mtime = 0;
- $dh = $this->opendir($path);
- if (is_resource($dh)) {
- while (($filename = readdir($dh)) !== false) {
- $tempmtime = $this->filemtime($filename);
- if ($tempmtime > $mtime) {
- $mtime = $tempmtime;
- }
- }
- }
- return $mtime;
- } else {
- $source = $this->getSourcePath($path);
- if ($source) {
- list($storage, $internalPath) = \OC\Files\Filesystem::resolvePath($source);
- return $storage->filemtime($internalPath);
- }
- }
+ $source = $this->getSourcePath($path);
+ list($storage, $internalPath) = \OC\Files\Filesystem::resolvePath($source);
+ return $storage->filemtime($internalPath);
}
public function file_get_contents($path) {
$source = $this->getSourcePath($path);
if ($source) {
$info = array(
- 'target' => $this->sharedFolder . $path,
+ 'target' => $this->getMountPoint() . $path,
'source' => $source,
);
\OCP\Util::emitHook('\OC\Files\Storage\Shared', 'file_get_contents', $info);
@@ -264,7 +251,7 @@ class Shared extends \OC\Files\Storage\Common {
return false;
}
$info = array(
- 'target' => $this->sharedFolder . $path,
+ 'target' => $this->getMountPoint() . '/' . $path,
'source' => $source,
);
\OCP\Util::emitHook('\OC\Files\Storage\Shared', 'file_put_contents', $info);
@@ -277,6 +264,7 @@ class Shared extends \OC\Files\Storage\Common {
public function unlink($path) {
// Delete the file if DELETE permission is granted
+ $path = ($path === false) ? '' : $path;
if ($source = $this->getSourcePath($path)) {
if ($this->isDeletable($path)) {
list($storage, $internalPath) = \OC\Files\Filesystem::resolvePath($source);
@@ -286,23 +274,117 @@ class Shared extends \OC\Files\Storage\Common {
return false;
}
+ /**
+ * @brief Format a path to be relative to the /user/files/ directory
+ * @param string $path the absolute path
+ * @return string e.g. turns '/admin/files/test.txt' into '/test.txt'
+ */
+ private static function stripUserFilesPath($path) {
+ $trimmed = ltrim($path, '/');
+ $split = explode('/', $trimmed);
+
+ // it is not a file relative to data/user/files
+ if (count($split) < 3 || $split[1] !== 'files') {
+ \OCP\Util::writeLog('file sharing',
+ 'Can not strip userid and "files/" from path: ' . $path,
+ \OCP\Util::DEBUG);
+ return false;
+ }
+
+ // skip 'user' and 'files'
+ $sliced = array_slice($split, 2);
+ $relPath = implode('/', $sliced);
+
+ return '/' . $relPath;
+ }
+
+ /**
+ * @brief rename a shared folder/file
+ * @param string $sourcePath
+ * @param string $targetPath
+ * @return bool
+ */
+ private function renameMountPoint($sourcePath, $targetPath) {
+
+ // it shouldn't be possible to move a Shared storage into another one
+ list($targetStorage, ) = \OC\Files\Filesystem::resolvePath($targetPath);
+ if ($targetStorage instanceof \OC\Files\Storage\Shared) {
+ \OCP\Util::writeLog('file sharing',
+ 'It is not allowed to move one mount point into another one',
+ \OCP\Util::DEBUG);
+ return false;
+ }
+
+ $relTargetPath = $this->stripUserFilesPath($targetPath);
+
+ // if the user renames a mount point from a group share we need to create a new db entry
+ // for the unique name
+ if ($this->getShareType() === \OCP\Share::SHARE_TYPE_GROUP && $this->uniqueNameSet() === false) {
+ $query = \OC_DB::prepare('INSERT INTO `*PREFIX*share` (`item_type`, `item_source`, `item_target`,'
+ .' `share_type`, `share_with`, `uid_owner`, `permissions`, `stime`, `file_source`,'
+ .' `file_target`, `token`, `parent`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)');
+ $arguments = array($this->share['item_type'], $this->share['item_source'], $this->share['item_target'],
+ 2, \OCP\User::getUser(), $this->share['uid_owner'], $this->share['permissions'], $this->share['stime'], $this->share['file_source'],
+ $relTargetPath, $this->share['token'], $this->share['id']);
+
+ } else {
+ // rename mount point
+ $query = \OC_DB::prepare(
+ 'Update `*PREFIX*share`
+ SET `file_target` = ?
+ WHERE `id` = ?'
+ );
+ $arguments = array($relTargetPath, $this->getShareId());
+ }
+
+ $result = $query->execute($arguments);
+
+ if ($result) {
+ // update the mount manager with the new paths
+ $mountManager = \OC\Files\Filesystem::getMountManager();
+ $mount = $mountManager->find($sourcePath);
+ $mount->setMountPoint($targetPath . '/');
+ $mountManager->addMount($mount);
+ $mountManager->removeMount($sourcePath . '/');
+ $this->setUniqueName();
+ $this->setMountPoint($relTargetPath);
+
+ } else {
+ \OCP\Util::writeLog('file sharing',
+ 'Could not rename mount point for shared folder "' . $sourcePath . '" to "' . $targetPath . '"',
+ \OCP\Util::ERROR);
+ }
+
+ return $result;
+ }
+
+
public function rename($path1, $path2) {
- // 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);
+
+ $sourceMountPoint = \OC\Files\Filesystem::getMountPoint($path1);
+ $targetMountPoint = \OC\Files\Filesystem::getMountPoint($path2);
+ $relPath1 = \OCA\Files_Sharing\Helper::stripUserFilesPath($path1);
+ $relPath2 = \OCA\Files_Sharing\Helper::stripUserFilesPath($path2);
+
+ // if we renamed the mount point we need to adjust the file_target in the
+ // database
+ if (\OC\Files\Filesystem::normalizePath($sourceMountPoint) === \OC\Files\Filesystem::normalizePath($path1)) {
+ return $this->renameMountPoint($path1, $path2);
+ }
+
+
+ if ( // Within the same mount point, we only need UPDATE permissions
+ ($sourceMountPoint === $targetMountPoint && $this->isUpdatable($sourceMountPoint)) ||
// otherwise DELETE and CREATE permissions required
- } elseif ($this->isDeletable($path1) && $this->isCreatable(dirname($path2))) {
- $rootView = new \OC\Files\View('');
- return $rootView->rename($oldSource, $newSource);
- }
+ ($this->isDeletable($path1) && $this->isCreatable(dirname($path2)))) {
+
+ list($user1, $path1) = \OCA\Files_Sharing\Helper::getUidAndFilename($relPath1);
+ $targetFilename = basename($relPath2);
+ list($user2, $path2) = \OCA\Files_Sharing\Helper::getUidAndFilename(dirname($relPath2));
+ $rootView = new \OC\Files\View('');
+ return $rootView->rename('/' . $user1 . '/files/' . $path1, '/' . $user2 . '/files/' . $path2 . '/' . $targetFilename);
}
+
return false;
}
@@ -343,7 +425,7 @@ class Shared extends \OC\Files\Storage\Common {
}
}
$info = array(
- 'target' => $this->sharedFolder . $path,
+ 'target' => $this->getMountPoint() . $path,
'source' => $source,
'mode' => $mode,
);
@@ -355,9 +437,6 @@ class Shared extends \OC\Files\Storage\Common {
}
public function getMimeType($path) {
- if ($path == '' || $path == '/') {
- return 'httpd/unix-directory';
- }
if ($source = $this->getSourcePath($path)) {
list($storage, $internalPath) = \OC\Files\Filesystem::resolvePath($source);
return $storage->getMimeType($internalPath);
@@ -367,13 +446,14 @@ class Shared extends \OC\Files\Storage\Common {
public function free_space($path) {
if ($path == '') {
- return \OC\Files\SPACE_UNKNOWN;
+ $path = $this->getMountPoint();
}
$source = $this->getSourcePath($path);
if ($source) {
list($storage, $internalPath) = \OC\Files\Filesystem::resolvePath($source);
return $storage->free_space($internalPath);
}
+ return \OC\Files\SPACE_UNKNOWN;
}
public function getLocalFile($path) {
@@ -393,20 +473,80 @@ class Shared extends \OC\Files\Storage\Common {
}
public static function setup($options) {
+ $shares = \OCP\Share::getItemsSharedWith('file');
if (!\OCP\User::isLoggedIn() || \OCP\User::getUser() != $options['user']
- || \OCP\Share::getItemsSharedWith('file')
+ || $shares
) {
- $user_dir = $options['user_dir'];
- \OC\Files\Filesystem::mount('\OC\Files\Storage\Shared',
- array('sharedFolder' => '/Shared'),
- $user_dir . '/Shared/');
+ foreach ($shares as $share) {
+ \OC\Files\Filesystem::mount('\OC\Files\Storage\Shared',
+ array(
+ 'share' => $share,
+ ),
+ $options['user_dir'] . '/' . $share['file_target']);
+ }
}
}
+ /**
+ * @brief return mount point of share, relative to data/user/files
+ * @return string
+ */
+ public function getMountPoint() {
+ return $this->share['file_target'];
+ }
+
+ /**
+ * @brief get share type
+ * @return integer can be single user share (0) group share (1), unique group share name (2)
+ */
+ private function getShareType() {
+ return $this->share['share_type'];
+ }
+
+ private function setMountPoint($path) {
+ $this->share['file_target'] = $path;
+ }
+
+ /**
+ * @brief does the group share already has a user specific unique name
+ * @return bool
+ */
+ private function uniqueNameSet() {
+ return (isset($this->share['unique_name']) && $this->share['unique_name']);
+ }
+
+ /**
+ * @brief the share now uses a unique name of this user
+ */
+ private function setUniqueName() {
+ $this->share['unique_name'] = true;
+ }
+
+ /**
+ * @brief get share ID
+ * @return integer unique share ID
+ */
+ private function getShareId() {
+ return $this->share['id'];
+ }
+
+ /**
+ * @brief get the user who shared the file
+ * @return string
+ */
+ public function getSharedFrom() {
+ return $this->share['uid_owner'];
+ }
+
+ /**
+ * @brief return share type, can be "file" or "folder"
+ * @return string
+ */
+ public function getItemType() {
+ return $this->share['item_type'];
+ }
+
public function hasUpdated($path, $time) {
- if ($path == '') {
- return false;
- }
return $this->filemtime($path) > $time;
}
@@ -428,7 +568,7 @@ class Shared extends \OC\Files\Storage\Common {
public function getOwner($path) {
if ($path == '') {
- return false;
+ $path = $this->getMountPoint();
}
$source = $this->getFile($path);
if ($source) {
@@ -439,7 +579,7 @@ class Shared extends \OC\Files\Storage\Common {
public function getETag($path) {
if ($path == '') {
- return parent::getETag($path);
+ $path = $this->getMountPoint();
}
if ($source = $this->getSourcePath($path)) {
list($storage, $internalPath) = \OC\Files\Filesystem::resolvePath($source);
diff --git a/apps/files_sharing/lib/updater.php b/apps/files_sharing/lib/updater.php
index e3a7679292d..f7c0a75aeeb 100644
--- a/apps/files_sharing/lib/updater.php
+++ b/apps/files_sharing/lib/updater.php
@@ -27,30 +27,47 @@ class Shared_Updater {
static private $toRemove = array();
/**
+ * @brief walk up the users file tree and update the etags
+ * @param string $user
+ * @param string $path
+ */
+ static private function correctUsersFolder($user, $path) {
+ // $path points to the mount point which is a virtual folder, so we start with
+ // the parent
+ $path = '/files' . dirname($path);
+ \OC\Files\Filesystem::initMountPoints($user);
+ $view = new \OC\Files\View('/' . $user);
+ if ($view->file_exists($path)) {
+ while ($path !== '/') {
+ $etag = $view->getETag($path);
+ $view->putFileInfo($path, array('etag' => $etag));
+ $path = dirname($path);
+ }
+ } else {
+ error_log("error!" . 'can not update etags on ' . $path . ' for user ' . $user);
+ \OCP\Util::writeLog('files_sharing', 'can not update etags on ' . $path . ' for user ' . $user, \OCP\Util::ERROR);
+ }
+ }
+
+ /**
* Correct the parent folders' ETags for all users shared the file at $target
*
* @param string $target
*/
static public function correctFolders($target) {
- $uid = \OCP\User::getUser();
- $uidOwner = \OC\Files\Filesystem::getOwner($target);
- $info = \OC\Files\Filesystem::getFileInfo($target);
- $checkedUser = array($uidOwner);
// Correct Shared folders of other users shared with
- $users = \OCP\Share::getUsersItemShared('file', $info['fileid'], $uidOwner, true);
- if (!empty($users)) {
- while (!empty($users)) {
- $reshareUsers = array();
+ $shares = \OCA\Files_Sharing\Helper::getSharesFromItem($target);
+
+ foreach ($shares as $share) {
+ if ((int)$share['share_type'] === \OCP\Share::SHARE_TYPE_USER) {
+ self::correctUsersFolder($share['share_with'], $share['file_target']);
+ } elseif ((int)$share['share_type'] === \OCP\Share::SHARE_TYPE_GROUP) {
+ $users = \OC_Group::usersInGroup($share['share_with']);
foreach ($users as $user) {
- if ( !in_array($user, $checkedUser) ) {
- $etag = \OC\Files\Filesystem::getETag('');
- \OCP\Config::setUserValue($user, 'files_sharing', 'etag', $etag);
- // Look for reshares
- $reshareUsers = array_merge($reshareUsers, \OCP\Share::getUsersItemShared('file', $info['fileid'], $user, true));
- $checkedUser[] = $user;
- }
+ self::correctUsersFolder($user, $share['file_target']);
}
- $users = $reshareUsers;
+ } else { //unique name for group share
+ self::correctUsersFolder($share['share_with'], $share['file_target']);
}
}
}
@@ -108,34 +125,6 @@ class Shared_Updater {
}
/**
- * @param array $params
- */
- static public function shareHook($params) {
- if ($params['itemType'] === 'file' || $params['itemType'] === 'folder') {
- 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();
- foreach ($users as $user) {
- if ($user !== $uidOwner) {
- $etag = \OC\Files\Filesystem::getETag('');
- \OCP\Config::setUserValue($user, 'files_sharing', 'etag', $etag);
- // Look for reshares
- $reshareUsers = array_merge($reshareUsers, \OCP\Share::getUsersItemShared('file', $params['fileSource'], $user, true));
- }
- }
- $users = $reshareUsers;
- }
- }
- }
- }
-
- /**
* clean up oc_share table from files which are no longer exists
*
* This fixes issues from updates from files_sharing < 0.3.5.6 (ownCloud 4.5)
diff --git a/apps/files_sharing/lib/watcher.php b/apps/files_sharing/lib/watcher.php
index 285b1a58c6e..11d3ce1cabd 100644
--- a/apps/files_sharing/lib/watcher.php
+++ b/apps/files_sharing/lib/watcher.php
@@ -32,7 +32,7 @@ class Shared_Watcher extends Watcher {
* @param string $path
*/
public function checkUpdate($path) {
- if ($path != '' && parent::checkUpdate($path) === true) {
+ if (parent::checkUpdate($path) === true) {
// since checkUpdate() has already updated the size of the subdirs,
// only apply the update to the owner's parent dirs
diff --git a/apps/files_sharing/tests/api.php b/apps/files_sharing/tests/api.php
index c7a848315ac..b2f05d10ac6 100644
--- a/apps/files_sharing/tests/api.php
+++ b/apps/files_sharing/tests/api.php
@@ -324,10 +324,10 @@ class Test_Files_Sharing_Api extends Test_Files_Sharing_Base {
$this->assertTrue(is_string($result));
$testValues=array(
- array('query' => 'Shared/' . $this->folder,
- 'expectedResult' => '/Shared' . $this->folder . $this->filename),
- array('query' => 'Shared/' . $this->folder . $this->subfolder,
- 'expectedResult' => '/Shared' . $this->folder . $this->subfolder . $this->filename),
+ array('query' => $this->folder,
+ 'expectedResult' => $this->folder . $this->filename),
+ array('query' => $this->folder . $this->subfolder,
+ 'expectedResult' => $this->folder . $this->subfolder . $this->filename),
);
foreach ($testValues as $value) {
@@ -382,7 +382,7 @@ class Test_Files_Sharing_Api extends Test_Files_Sharing_Base {
// share was successful?
$this->assertTrue(is_string($result));
- $_GET['path'] = '/Shared';
+ $_GET['path'] = '/';
$_GET['subfiles'] = 'true';
$result = Share\Api::getAllShares(array());
@@ -395,7 +395,7 @@ class Test_Files_Sharing_Api extends Test_Files_Sharing_Base {
// we should get exactly one result
$this->assertEquals(1, count($data));
- $expectedPath = '/Shared' . $this->subfolder;
+ $expectedPath = $this->subfolder;
$this->assertEquals($expectedPath, $data[0]['path']);
// cleanup
@@ -444,7 +444,7 @@ class Test_Files_Sharing_Api extends Test_Files_Sharing_Base {
$this->assertTrue(is_string($result));
- $_GET['path'] = '/Shared';
+ $_GET['path'] = '/';
$_GET['subfiles'] = 'true';
$result = Share\Api::getAllShares(array());
@@ -457,7 +457,7 @@ class Test_Files_Sharing_Api extends Test_Files_Sharing_Base {
// we should get exactly one result
$this->assertEquals(1, count($data));
- $expectedPath = '/Shared' . $this->subsubfolder;
+ $expectedPath = $this->subsubfolder;
$this->assertEquals($expectedPath, $data[0]['path']);
@@ -512,8 +512,8 @@ class Test_Files_Sharing_Api extends Test_Files_Sharing_Base {
$this->assertTrue(is_string($result));
- // ask for shared/subfolder
- $expectedPath1 = '/Shared' . $this->subfolder;
+ // ask for subfolder
+ $expectedPath1 = $this->subfolder;
$_GET['path'] = $expectedPath1;
$result1 = Share\Api::getAllShares(array());
@@ -524,8 +524,8 @@ class Test_Files_Sharing_Api extends Test_Files_Sharing_Base {
$data1 = $result1->getData();
$share1 = reset($data1);
- // ask for shared/folder/subfolder
- $expectedPath2 = '/Shared' . $this->folder . $this->subfolder;
+ // ask for folder/subfolder
+ $expectedPath2 = $this->folder . $this->subfolder;
$_GET['path'] = $expectedPath2;
$result2 = Share\Api::getAllShares(array());
@@ -595,7 +595,7 @@ class Test_Files_Sharing_Api extends Test_Files_Sharing_Base {
$this->assertTrue(is_string($result));
- $_GET['path'] = '/Shared';
+ $_GET['path'] = '/';
$_GET['subfiles'] = 'true';
$result = Share\Api::getAllShares(array());
@@ -608,7 +608,7 @@ class Test_Files_Sharing_Api extends Test_Files_Sharing_Base {
// we should get exactly one result
$this->assertEquals(1, count($data));
- $expectedPath = '/Shared' . $this->filename;
+ $expectedPath = $this->filename;
$this->assertEquals($expectedPath, $data[0]['path']);
@@ -866,16 +866,66 @@ class Test_Files_Sharing_Api extends Test_Files_Sharing_Base {
$this->assertTrue($result3->succeeded());
+ // cleanup
+ \Test_Files_Sharing_Api::loginHelper(\Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER1);
+
+ $result = \OCP\Share::unshare('folder', $fileInfo1['fileid'], \OCP\Share::SHARE_TYPE_USER,
+ \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2);
+
+ $this->assertTrue($result);
+
+
+
}
- function testCorrectPath() {
- $path = "/foo/bar/test.txt";
- $folder = "/correct/path";
- $expectedResult = "/correct/path/test.txt";
+ /**
+ * @brief share a folder which contains a share mount point, should be forbidden
+ */
+ public function testShareFolderWithAMountPoint() {
+ // user 1 shares a folder with user2
+ \Test_Files_Sharing_Api::loginHelper(\Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER1);
+
+ $fileInfo = $this->view->getFileInfo($this->folder);
+
+ $result = \OCP\Share::shareItem('folder', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
+ \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2, 31);
+
+ $this->assertTrue($result);
+
+ // user2 shares a file from the folder as link
+ \Test_Files_Sharing_Api::loginHelper(\Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2);
+
+ $view = new \OC\Files\View('/' . \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2 . '/files');
+ $view->mkdir("localDir");
+
+ // move mount point to the folder "localDir"
+ $result = $view->rename($this->folder, 'localDir/'.$this->folder);
+ $this->assertTrue($result !== false);
+
+ // try to share "localDir"
+ $fileInfo2 = $view->getFileInfo('localDir');
+
+ $this->assertTrue($fileInfo2 instanceof \OC\Files\FileInfo);
+
+ try {
+ $result2 = \OCP\Share::shareItem('folder', $fileInfo2['fileid'], \OCP\Share::SHARE_TYPE_USER,
+ \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER3, 31);
+ } catch (\Exception $e) {
+ $result2 = false;
+ }
- $shareApiDummy = new TestShareApi();
+ $this->assertFalse($result2);
- $this->assertSame($expectedResult, $shareApiDummy->correctPathTest($path, $folder));
+ //cleanup
+
+ $result = $view->rename('localDir/' . $this->folder, $this->folder);
+ $this->assertTrue($result !== false);
+ $view->unlink('localDir');
+
+ \Test_Files_Sharing_Api::loginHelper(\Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER1);
+
+ \OCP\Share::unshare('folder', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
+ \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2);
}
/**
@@ -902,12 +952,3 @@ class Test_Files_Sharing_Api extends Test_Files_Sharing_Base {
}
}
-
-/**
- * @brief dumnmy class to test protected methods
- */
-class TestShareApi extends \OCA\Files\Share\Api {
- public function correctPathTest($path, $folder) {
- return self::correctPath($path, $folder);
- }
-}
diff --git a/apps/files_sharing/tests/base.php b/apps/files_sharing/tests/base.php
index d44972d01f1..495dca072c7 100644
--- a/apps/files_sharing/tests/base.php
+++ b/apps/files_sharing/tests/base.php
@@ -102,22 +102,20 @@ abstract class Test_Files_Sharing_Base extends \PHPUnit_Framework_TestCase {
* @param bool $password
*/
protected static function loginHelper($user, $create = false, $password = false) {
- if ($create) {
- \OC_User::createUser($user, $user);
- }
if ($password === false) {
$password = $user;
}
+ if ($create) {
+ \OC_User::createUser($user, $password);
+ }
+
\OC_Util::tearDownFS();
\OC_User::setUserId('');
\OC\Files\Filesystem::tearDown();
- \OC_Util::setupFS($user);
\OC_User::setUserId($user);
-
- $params['uid'] = $user;
- $params['password'] = $password;
+ \OC_Util::setupFS($user);
}
/**
diff --git a/apps/files_sharing/tests/cache.php b/apps/files_sharing/tests/cache.php
index 47969833ab5..1af73c558d5 100644
--- a/apps/files_sharing/tests/cache.php
+++ b/apps/files_sharing/tests/cache.php
@@ -68,7 +68,7 @@ class Test_Files_Sharing_Cache extends Test_Files_Sharing_Base {
// retrieve the shared storage
$secondView = new \OC\Files\View('/' . self::TEST_FILES_SHARING_API_USER2);
- list($this->sharedStorage, $internalPath) = $secondView->resolvePath('files/Shared/shareddir');
+ list($this->sharedStorage, $internalPath) = $secondView->resolvePath('files/shareddir');
$this->sharedCache = $this->sharedStorage->getCache();
}
@@ -99,45 +99,45 @@ class Test_Files_Sharing_Cache extends Test_Files_Sharing_Base {
$results = $this->sharedStorage->getCache()->searchByMime('text');
$check = array(
array(
- 'name' => 'shared single file.txt',
- 'path' => 'shared single file.txt'
- ),
- array(
'name' => 'bar.txt',
- 'path' => 'shareddir/bar.txt'
+ 'path' => 'bar.txt'
),
array(
'name' => 'another too.txt',
- 'path' => 'shareddir/subdir/another too.txt'
+ 'path' => 'subdir/another too.txt'
),
array(
'name' => 'another.txt',
- 'path' => 'shareddir/subdir/another.txt'
+ 'path' => 'subdir/another.txt'
),
);
$this->verifyFiles($check, $results);
- $results2 = $this->sharedStorage->getCache()->searchByMime('text/plain');
-
$this->verifyFiles($check, $results);
}
function testGetFolderContentsInRoot() {
- $results = $this->user2View->getDirectoryContent('/Shared/');
+ $results = $this->user2View->getDirectoryContent('/');
+ // we should get the shared items "shareddir" and "shared single file.txt"
+ // additional root will always contain the example file "welcome.txt",
+ // so this will be part of the result
$this->verifyFiles(
array(
array(
+ 'name' => 'welcome.txt',
+ 'path' => 'files/welcome.txt',
+ 'mimetype' => 'text/plain',
+ ),
+ array(
'name' => 'shareddir',
- 'path' => '/shareddir',
+ 'path' => 'files/shareddir',
'mimetype' => 'httpd/unix-directory',
- 'usersPath' => 'files/Shared/shareddir'
),
array(
'name' => 'shared single file.txt',
- 'path' => '/shared single file.txt',
+ 'path' => 'files/shared single file.txt',
'mimetype' => 'text/plain',
- 'usersPath' => 'files/Shared/shared single file.txt'
),
),
$results
@@ -145,27 +145,24 @@ class Test_Files_Sharing_Cache extends Test_Files_Sharing_Base {
}
function testGetFolderContentsInSubdir() {
- $results = $this->user2View->getDirectoryContent('/Shared/shareddir');
+ $results = $this->user2View->getDirectoryContent('/shareddir');
$this->verifyFiles(
array(
array(
'name' => 'bar.txt',
- 'path' => 'files/container/shareddir/bar.txt',
+ 'path' => 'bar.txt',
'mimetype' => 'text/plain',
- 'usersPath' => 'files/Shared/shareddir/bar.txt'
),
array(
'name' => 'emptydir',
- 'path' => 'files/container/shareddir/emptydir',
+ 'path' => 'emptydir',
'mimetype' => 'httpd/unix-directory',
- 'usersPath' => 'files/Shared/shareddir/emptydir'
),
array(
'name' => 'subdir',
- 'path' => 'files/container/shareddir/subdir',
+ 'path' => 'subdir',
'mimetype' => 'httpd/unix-directory',
- 'usersPath' => 'files/Shared/shareddir/subdir'
),
),
$results
@@ -182,27 +179,24 @@ class Test_Files_Sharing_Cache extends Test_Files_Sharing_Base {
self::loginHelper(self::TEST_FILES_SHARING_API_USER3);
$thirdView = new \OC\Files\View('/' . self::TEST_FILES_SHARING_API_USER3 . '/files');
- $results = $thirdView->getDirectoryContent('/Shared/subdir');
+ $results = $thirdView->getDirectoryContent('/subdir');
$this->verifyFiles(
array(
array(
'name' => 'another too.txt',
- 'path' => 'files/container/shareddir/subdir/another too.txt',
+ 'path' => 'another too.txt',
'mimetype' => 'text/plain',
- 'usersPath' => 'files/Shared/subdir/another too.txt'
),
array(
'name' => 'another.txt',
- 'path' => 'files/container/shareddir/subdir/another.txt',
+ 'path' => 'another.txt',
'mimetype' => 'text/plain',
- 'usersPath' => 'files/Shared/subdir/another.txt'
),
array(
'name' => 'not a text file.xml',
- 'path' => 'files/container/shareddir/subdir/not a text file.xml',
+ 'path' => 'not a text file.xml',
'mimetype' => 'application/xml',
- 'usersPath' => 'files/Shared/subdir/not a text file.xml'
),
),
$results
@@ -254,14 +248,14 @@ class Test_Files_Sharing_Cache extends Test_Files_Sharing_Base {
\OC_Util::tearDownFS();
self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
- $this->assertTrue(\OC\Files\Filesystem::file_exists('/Shared/test.txt'));
- list($sharedStorage) = \OC\Files\Filesystem::resolvePath('/' . self::TEST_FILES_SHARING_API_USER2 . '/files/Shared/test.txt');
+ $this->assertTrue(\OC\Files\Filesystem::file_exists('/test.txt'));
+ list($sharedStorage) = \OC\Files\Filesystem::resolvePath('/' . self::TEST_FILES_SHARING_API_USER2 . '/files/test.txt');
/**
* @var \OC\Files\Storage\Shared $sharedStorage
*/
$sharedCache = $sharedStorage->getCache();
- $this->assertEquals('test.txt', $sharedCache->getPathById($info->getId()));
+ $this->assertEquals('', $sharedCache->getPathById($info->getId()));
}
public function testGetPathByIdShareSubFolder() {
@@ -275,14 +269,14 @@ class Test_Files_Sharing_Cache extends Test_Files_Sharing_Base {
\OC_Util::tearDownFS();
self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
- $this->assertTrue(\OC\Files\Filesystem::file_exists('/Shared/foo'));
- list($sharedStorage) = \OC\Files\Filesystem::resolvePath('/' . self::TEST_FILES_SHARING_API_USER2 . '/files/Shared/foo');
+ $this->assertTrue(\OC\Files\Filesystem::file_exists('/foo'));
+ list($sharedStorage) = \OC\Files\Filesystem::resolvePath('/' . self::TEST_FILES_SHARING_API_USER2 . '/files/foo');
/**
* @var \OC\Files\Storage\Shared $sharedStorage
*/
$sharedCache = $sharedStorage->getCache();
- $this->assertEquals('foo', $sharedCache->getPathById($folderInfo->getId()));
- $this->assertEquals('foo/bar/test.txt', $sharedCache->getPathById($fileInfo->getId()));
+ $this->assertEquals('', $sharedCache->getPathById($folderInfo->getId()));
+ $this->assertEquals('bar/test.txt', $sharedCache->getPathById($fileInfo->getId()));
}
}
diff --git a/apps/files_sharing/tests/permissions.php b/apps/files_sharing/tests/permissions.php
index e301d384a49..5ac251b0527 100644
--- a/apps/files_sharing/tests/permissions.php
+++ b/apps/files_sharing/tests/permissions.php
@@ -23,6 +23,9 @@ require_once __DIR__ . '/base.php';
class Test_Files_Sharing_Permissions extends Test_Files_Sharing_Base {
+ private $sharedStorageRestrictedShare;
+ private $sharedCacheRestrictedShare;
+
function setUp() {
parent::setUp();
@@ -55,8 +58,10 @@ class Test_Files_Sharing_Permissions extends Test_Files_Sharing_Base {
// retrieve the shared storage
$this->secondView = new \OC\Files\View('/' . self::TEST_FILES_SHARING_API_USER2);
- list($this->sharedStorage, $internalPath) = $this->secondView->resolvePath('files/Shared/shareddir');
+ list($this->sharedStorage, $internalPath) = $this->secondView->resolvePath('files/shareddir');
+ list($this->sharedStorageRestrictedShare, $internalPath) = $this->secondView->resolvePath('files/shareddirrestricted');
$this->sharedCache = $this->sharedStorage->getCache();
+ $this->sharedCacheRestrictedShare = $this->sharedStorageRestrictedShare->getCache();
}
function tearDown() {
@@ -86,9 +91,9 @@ class Test_Files_Sharing_Permissions extends Test_Files_Sharing_Base {
$this->assertEquals(31, $sharedDirPerms);
$sharedDirPerms = $this->sharedStorage->getPermissions('shareddir/textfile.txt');
$this->assertEquals(31, $sharedDirPerms);
- $sharedDirRestrictedPerms = $this->sharedStorage->getPermissions('shareddirrestricted');
+ $sharedDirRestrictedPerms = $this->sharedStorageRestrictedShare->getPermissions('shareddirrestricted');
$this->assertEquals(7, $sharedDirRestrictedPerms);
- $sharedDirRestrictedPerms = $this->sharedStorage->getPermissions('shareddirrestricted/textfile.txt');
+ $sharedDirRestrictedPerms = $this->sharedStorageRestrictedShare->getPermissions('shareddirrestricted/textfile.txt');
$this->assertEquals(7, $sharedDirRestrictedPerms);
}
@@ -96,12 +101,12 @@ class Test_Files_Sharing_Permissions extends Test_Files_Sharing_Base {
* Test that the permissions of shared directory are returned correctly
*/
function testGetDirectoryPermissions() {
- $contents = $this->secondView->getDirectoryContent('files/Shared/shareddir');
+ $contents = $this->secondView->getDirectoryContent('files/shareddir');
$this->assertEquals('subdir', $contents[0]['name']);
$this->assertEquals(31, $contents[0]['permissions']);
$this->assertEquals('textfile.txt', $contents[1]['name']);
$this->assertEquals(31, $contents[1]['permissions']);
- $contents = $this->secondView->getDirectoryContent('files/Shared/shareddirrestricted');
+ $contents = $this->secondView->getDirectoryContent('files/shareddirrestricted');
$this->assertEquals('subdir', $contents[0]['name']);
$this->assertEquals(7, $contents[0]['permissions']);
$this->assertEquals('textfile1.txt', $contents[1]['name']);
diff --git a/apps/files_sharing/tests/updater.php b/apps/files_sharing/tests/updater.php
index 79ae4879b64..3427cfe388c 100644
--- a/apps/files_sharing/tests/updater.php
+++ b/apps/files_sharing/tests/updater.php
@@ -20,6 +20,8 @@
*
*/
+require_once __DIR__ . '/../appinfo/update.php';
+
/**
* Class Test_Files_Sharing_Updater
*/
@@ -88,4 +90,57 @@ class Test_Files_Sharing_Updater extends \PHPUnit_Framework_TestCase {
$result = $countItems->execute()->fetchOne();
$this->assertEquals(2, $result);
}
+
+ /**
+ * test update for the removal of the logical "Shared" folder. It should update
+ * the file_target for every share and create a physical "Shared" folder for each user
+ */
+ function testRemoveSharedFolder() {
+ self::prepareDB();
+ // run the update routine to remove the shared folder and replace it with a real folder
+ removeSharedFolder(false, 2);
+
+ // verify results
+ $query = \OC_DB::prepare('SELECT * FROM `*PREFIX*share`');
+ $result = $query->execute(array());
+
+ $newDBContent = $result->fetchAll();
+
+ foreach ($newDBContent as $row) {
+ if ((int)$row['share_type'] === \OCP\Share::SHARE_TYPE_USER) {
+ $this->assertSame('/Shared', substr($row['file_target'], 0, strlen('/Shared')));
+ } else {
+ $this->assertSame('/ShouldNotChange', $row['file_target']);
+ }
+ }
+
+ $this->cleanupSharedTable();
+
+ }
+
+ private function cleanupSharedTable() {
+ $query = \OC_DB::prepare('DELETE FROM `*PREFIX*share`');
+ $query->execute();
+ }
+
+ private function prepareDB() {
+ $this->cleanupSharedTable();
+ // add items except one - because this is the test case for the broken share table
+ $addItems = \OC_DB::prepare('INSERT INTO `*PREFIX*share` (`share_type`, `item_type`, ' .
+ '`share_with`, `uid_owner` , `file_target`) ' .
+ 'VALUES (?, ?, ?, ?, ?)');
+ $items = array(
+ array(\OCP\Share::SHARE_TYPE_USER, 'file', 'user1', 'admin' , '/foo'),
+ array(\OCP\Share::SHARE_TYPE_USER, 'folder', 'user2', 'admin', '/foo2'),
+ array(\OCP\Share::SHARE_TYPE_USER, 'file', 'user3', 'admin', '/foo3'),
+ array(\OCP\Share::SHARE_TYPE_USER, 'folder', 'user4', 'admin', '/foo4'),
+ array(\OCP\Share::SHARE_TYPE_LINK, 'file', 'user1', 'admin', '/ShouldNotChange'),
+ array(\OCP\Share::SHARE_TYPE_CONTACT, 'contact', 'admin', 'user1', '/ShouldNotChange'),
+
+ );
+ foreach($items as $item) {
+ // the number is used as path_hash
+ $addItems->execute($item);
+ }
+ }
}
diff --git a/apps/files_sharing/tests/watcher.php b/apps/files_sharing/tests/watcher.php
index 5ab716e829f..bce93c80a6c 100644
--- a/apps/files_sharing/tests/watcher.php
+++ b/apps/files_sharing/tests/watcher.php
@@ -48,7 +48,7 @@ class Test_Files_Sharing_Watcher extends Test_Files_Sharing_Base {
// retrieve the shared storage
$secondView = new \OC\Files\View('/' . self::TEST_FILES_SHARING_API_USER2);
- list($this->sharedStorage, $internalPath) = $secondView->resolvePath('files/Shared/shareddir');
+ list($this->sharedStorage, $internalPath) = $secondView->resolvePath('files/shareddir');
$this->sharedCache = $this->sharedStorage->getCache();
}
@@ -77,12 +77,12 @@ class Test_Files_Sharing_Watcher extends Test_Files_Sharing_Base {
$textData = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$dataLen = strlen($textData);
- $this->sharedCache->put('shareddir/bar.txt', array('storage_mtime' => 10));
- $this->sharedStorage->file_put_contents('shareddir/bar.txt', $textData);
- $this->sharedCache->put('shareddir', array('storage_mtime' => 10));
+ $this->sharedCache->put('bar.txt', array('mtime' => 10, 'storage_mtime' => 10, 'size' => $dataLen, 'mimetype' => 'text/plain'));
+ $this->sharedStorage->file_put_contents('bar.txt', $textData);
+ $this->sharedCache->put('', array('mtime' => 10, 'storage_mtime' => 10, 'size' => '-1', 'mimetype' => 'httpd/unix-directory'));
// run the propagation code
- $result = $this->sharedStorage->getWatcher()->checkUpdate('shareddir');
+ $result = $this->sharedStorage->getWatcher()->checkUpdate('');
$this->assertTrue($result);
@@ -94,7 +94,7 @@ class Test_Files_Sharing_Watcher extends Test_Files_Sharing_Base {
$this->assertEquals($initialSizes['files/container/shareddir'] + $dataLen, $newSizes['files/container/shareddir']);
// no more updates
- $result = $this->sharedStorage->getWatcher()->checkUpdate('shareddir');
+ $result = $this->sharedStorage->getWatcher()->checkUpdate('');
$this->assertFalse($result);
}
@@ -108,12 +108,12 @@ class Test_Files_Sharing_Watcher extends Test_Files_Sharing_Base {
$textData = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$dataLen = strlen($textData);
- $this->sharedCache->put('shareddir/subdir/bar.txt', array('storage_mtime' => 10));
- $this->sharedStorage->file_put_contents('shareddir/subdir/bar.txt', $textData);
- $this->sharedCache->put('shareddir/subdir', array('storage_mtime' => 10));
+ $this->sharedCache->put('subdir/bar.txt', array('mtime' => 10, 'storage_mtime' => 10, 'size' => $dataLen, 'mimetype' => 'text/plain'));
+ $this->sharedStorage->file_put_contents('subdir/bar.txt', $textData);
+ $this->sharedCache->put('subdir', array('mtime' => 10, 'storage_mtime' => 10, 'size' => $dataLen, 'mimetype' => 'text/plain'));
// run the propagation code
- $result = $this->sharedStorage->getWatcher()->checkUpdate('shareddir/subdir');
+ $result = $this->sharedStorage->getWatcher()->checkUpdate('subdir');
$this->assertTrue($result);
@@ -126,20 +126,9 @@ class Test_Files_Sharing_Watcher extends Test_Files_Sharing_Base {
$this->assertEquals($initialSizes['files/container/shareddir/subdir'] + $dataLen, $newSizes['files/container/shareddir/subdir']);
// no more updates
- $result = $this->sharedStorage->getWatcher()->checkUpdate('shareddir/subdir');
-
- $this->assertFalse($result);
- }
-
- function testNoUpdateOnRoot() {
- // no updates when called for root path
- $result = $this->sharedStorage->getWatcher()->checkUpdate('');
+ $result = $this->sharedStorage->getWatcher()->checkUpdate('subdir');
$this->assertFalse($result);
-
- // FIXME: for some reason when running this "naked" test,
- // there will be remaining nonsensical entries in the
- // database with a path "test-share-user1/container/..."
}
/**
diff --git a/apps/user_ldap/js/ldapFilter.js b/apps/user_ldap/js/ldapFilter.js
new file mode 100644
index 00000000000..df3bd67aec2
--- /dev/null
+++ b/apps/user_ldap/js/ldapFilter.js
@@ -0,0 +1,100 @@
+/* global LdapWizard */
+
+function LdapFilter(target) {
+ this.locked = true;
+ this.target = false;
+ this.mode = LdapWizard.filterModeAssisted;
+ this.lazyRunCompose = false;
+
+ if( target === 'User' ||
+ target === 'Login' ||
+ target === 'Group') {
+ this.target = target;
+ this.determineMode();
+ }
+}
+
+LdapFilter.prototype.compose = function() {
+ var action;
+
+ if(this.locked) {
+ this.lazyRunCompose = true;
+ return false;
+ }
+
+ if(this.target === 'User') {
+ action = 'getUserListFilter';
+ } else if(this.target === 'Login') {
+ action = 'getUserLoginFilter';
+ } else if(this.target === 'Group') {
+ action = 'getGroupFilter';
+ }
+
+ if(!$('#raw'+this.target+'FilterContainer').hasClass('invisible')) {
+ //Raw filter editing, i.e. user defined filter, don't compose
+ return;
+ }
+
+ var param = 'action='+action+
+ '&ldap_serverconfig_chooser='+
+ encodeURIComponent($('#ldap_serverconfig_chooser').val());
+
+ var filter = this;
+
+ LdapWizard.ajax(param,
+ function(result) {
+ LdapWizard.applyChanges(result);
+ if(filter.target === 'User') {
+ LdapWizard.countUsers();
+ } else if(filter.target === 'Group') {
+ LdapWizard.countGroups();
+ LdapWizard.detectGroupMemberAssoc();
+ }
+ },
+ function () {
+ console.log('LDAP Wizard: could not compose filter. '+
+ 'Please check owncloud.log');
+ }
+ );
+};
+
+LdapFilter.prototype.determineMode = function() {
+ var param = 'action=get'+encodeURIComponent(this.target)+'FilterMode'+
+ '&ldap_serverconfig_chooser='+
+ encodeURIComponent($('#ldap_serverconfig_chooser').val());
+
+ var filter = this;
+ LdapWizard.ajax(param,
+ function(result) {
+ var property = 'ldap' + filter.target + 'FilterMode';
+ filter.mode = parseInt(result.changes[property], 10);
+ if(filter.mode === LdapWizard.filterModeRaw &&
+ $('#raw'+filter.target+'FilterContainer').hasClass('invisible')) {
+ LdapWizard['toggleRaw'+filter.target+'Filter']();
+ } else if(filter.mode === LdapWizard.filterModeAssisted &&
+ !$('#raw'+filter.target+'FilterContainer').hasClass('invisible')) {
+ LdapWizard['toggleRaw'+filter.target+'Filter']();
+ } else {
+ console.log('LDAP Wizard determineMode: returned mode was »' +
+ filter.mode + '« of type ' + typeof filter.mode);
+ }
+ filter.unlock();
+ },
+ function () {
+ //on error case get back to default i.e. Assisted
+ if(!$('#raw'+filter.target+'FilterContainer').hasClass('invisible')) {
+ LdapWizard['toggleRaw'+filter.target+'Filter']();
+ filter.mode = LdapWizard.filterModeAssisted;
+ }
+ filter.unlock();
+ }
+ );
+};
+
+LdapFilter.prototype.unlock = function() {
+ this.locked = false;
+ if(this.lazyRunCompose) {
+ this.lazyRunCompose = false;
+ this.compose();
+ }
+};
diff --git a/apps/user_ldap/js/settings.js b/apps/user_ldap/js/settings.js
index 792638f2b58..fca2dc13d15 100644
--- a/apps/user_ldap/js/settings.js
+++ b/apps/user_ldap/js/settings.js
@@ -14,7 +14,7 @@ var LdapConfiguration = {
//deal with Checkboxes
if($(elementID).is('input[type=checkbox]')) {
- if(parseInt(configvalue) === 1) {
+ if(parseInt(configvalue, 10) === 1) {
$(elementID).attr('checked', 'checked');
} else {
$(elementID).removeAttr('checked');
@@ -145,6 +145,9 @@ var LdapWizard = {
spinner: '<img class="wizSpinner" src="'+ OC.imagePath('core', 'loading.gif') +'">',
filterModeAssisted: 0,
filterModeRaw: 1,
+ userFilter: false,
+ loginFilter: false,
+ groupFilter: false,
ajax: function(param, fnOnSuccess, fnOnError) {
$.post(
@@ -276,41 +279,6 @@ var LdapWizard = {
}
},
- composeFilter: function(type) {
- subject = type.charAt(0).toUpperCase() + type.substr(1);
- if(!$('#raw'+subject+'FilterContainer').hasClass('invisible')) {
- //Raw filter editing, i.e. user defined filter, don't compose
- return;
- }
-
- if(type == 'user') {
- action = 'getUserListFilter';
- } else if(type == 'login') {
- action = 'getUserLoginFilter';
- } else if(type == 'group') {
- action = 'getGroupFilter';
- }
-
- param = 'action='+action+
- '&ldap_serverconfig_chooser='+
- encodeURIComponent($('#ldap_serverconfig_chooser').val());
-
- LdapWizard.ajax(param,
- function(result) {
- LdapWizard.applyChanges(result);
- if(type == 'user') {
- LdapWizard.countUsers();
- } else if(type == 'group') {
- LdapWizard.countGroups();
- LdapWizard.detectGroupMemberAssoc();
- }
- },
- function (result) {
- // error handling
- }
- );
- },
-
controlBack: function() {
curTabIndex = $('#ldapSettings').tabs('option', 'active');
if(curTabIndex == 0) {
@@ -510,7 +478,7 @@ var LdapWizard = {
},
functionalityCheck: function() {
- //criterias to enable the connection:
+ //criteria to enable the connection:
// - host, port, basedn, user filter, login filter
host = $('#ldap_host').val();
port = $('#ldap_port').val();
@@ -560,7 +528,7 @@ var LdapWizard = {
},
initGroupFilter: function() {
- LdapWizard.regardFilterMode('Group');
+ LdapWizard.groupFilter = new LdapFilter('Group');
LdapWizard.findObjectClasses('ldap_groupfilter_objectclass', 'Group');
LdapWizard.findAvailableGroups('ldap_groupfilter_groups', 'Groups');
LdapWizard.countGroups();
@@ -569,13 +537,13 @@ var LdapWizard = {
/** init login filter tab section **/
initLoginFilter: function() {
- LdapWizard.regardFilterMode('Login');
+ LdapWizard.loginFilter = new LdapFilter('Login');
LdapWizard.findAttributes();
},
postInitLoginFilter: function() {
if($('#rawLoginFilterContainer').hasClass('invisible')) {
- LdapWizard.composeFilter('login');
+ LdapWizard.loginFilter.compose();
}
},
@@ -588,7 +556,7 @@ var LdapWizard = {
noneSelectedText: caption,
click: function(event, ui) {
LdapWizard.saveMultiSelect(id,
- $('#'+id).multiselect("getChecked"));
+ $('#'+id).multiselect("getChecked"));
}
});
},
@@ -601,15 +569,15 @@ var LdapWizard = {
initUserFilter: function() {
LdapWizard.userFilterObjectClassesHasRun = false;
LdapWizard.userFilterAvailableGroupsHasRun = false;
- LdapWizard.regardFilterMode('User');
+ LdapWizard.userFilter = new LdapFilter('User');
LdapWizard.findObjectClasses('ldap_userfilter_objectclass', 'User');
LdapWizard.findAvailableGroups('ldap_userfilter_groups', 'Users');
},
postInitUserFilter: function() {
- if(LdapWizard.userFilterObjectClassesHasRun
- && LdapWizard.userFilterAvailableGroupsHasRun) {
- LdapWizard.composeFilter('user');
+ if(LdapWizard.userFilterObjectClassesHasRun &&
+ LdapWizard.userFilterAvailableGroupsHasRun) {
+ LdapWizard.userFilter.compose();
LdapWizard.countUsers();
}
},
@@ -658,7 +626,7 @@ var LdapWizard = {
if(triggerObj.id == 'ldap_loginfilter_username'
|| triggerObj.id == 'ldap_loginfilter_email') {
- LdapWizard.composeFilter('login');
+ LdapWizard.loginFilter.compose();
}
if($('#ldapSettings').tabs('option', 'active') == 0) {
@@ -667,32 +635,6 @@ var LdapWizard = {
}
},
- regardFilterMode: function(subject) {
- param = 'action=get'+encodeURIComponent(subject)+'FilterMode'+
- '&ldap_serverconfig_chooser='+
- encodeURIComponent($('#ldap_serverconfig_chooser').val());
-
- LdapWizard.ajax(param,
- function(result) {
- property = 'ldap' + subject + 'FilterMode';
- mode = result.changes[property];
- if(mode == LdapWizard.filterModeRaw
- && $('#raw'+subject+'FilterContainer').hasClass('invisible')) {
- LdapWizard['toggleRaw'+subject+'Filter']();
- } else if(mode == LdapWizard.filterModeAssisted
- && !$('#raw'+subject+'FilterContainer').hasClass('invisible')) {
- LdapWizard['toggleRaw'+subject+'Filter']();
- }
- },
- function (result) {
- //on error case get back to default i.e. Assisted
- if(!$('#raw'+subject+'FilterContainer').hasClass('invisible')) {
- LdapWizard['toggleRaw'+subject+'Filter']();
- }
- }
- );
- },
-
save: function(inputObj) {
if(LdapWizard.blacklistRemove(inputObj.id)) {
return;
@@ -714,15 +656,15 @@ var LdapWizard = {
LdapWizard._save($('#'+originalObj)[0], $.trim(values));
if(originalObj == 'ldap_userfilter_objectclass'
|| originalObj == 'ldap_userfilter_groups') {
- LdapWizard.composeFilter('user');
+ LdapWizard.userFilter.compose();
//when user filter is changed afterwards, login filter needs to
//be adjusted, too
- LdapWizard.composeFilter('login');
+ LdapWizard.loginFilter.compose();
} else if(originalObj == 'ldap_loginfilter_attributes') {
- LdapWizard.composeFilter('login');
+ LdapWizard.loginFilter.compose();
} else if(originalObj == 'ldap_groupfilter_objectclass'
|| originalObj == 'ldap_groupfilter_groups') {
- LdapWizard.composeFilter('group');
+ LdapWizard.groupFilter.compose();
}
},
@@ -778,10 +720,10 @@ var LdapWizard = {
LdapWizard._save({ id: modeKey }, LdapWizard.filterModeAssisted);
if(moc.indexOf('user') >= 0) {
LdapWizard.blacklistRemove('ldap_userlist_filter');
- LdapWizard.composeFilter('user');
+ LdapWizard.userFilter.compose();
} else {
LdapWizard.blacklistRemove('ldap_group_filter');
- LdapWizard.composeFilter('group');
+ LdapWizard.groupFilter.compose();
}
}
},
@@ -815,7 +757,7 @@ var LdapWizard = {
$('#ldap_loginfilter_username').prop('disabled', property);
LdapWizard._save({ id: 'ldapLoginFilterMode' }, mode);
if(action == 'enable') {
- LdapWizard.composeFilter('login');
+ LdapWizard.loginFilter.compose();
}
},
diff --git a/apps/user_ldap/l10n/af_ZA.php b/apps/user_ldap/l10n/af_ZA.php
index 130e471e0e4..483a30b8e48 100644
--- a/apps/user_ldap/l10n/af_ZA.php
+++ b/apps/user_ldap/l10n/af_ZA.php
@@ -3,6 +3,7 @@ $TRANSLATIONS = array(
"_%s group found_::_%s groups found_" => array("",""),
"_%s user found_::_%s users found_" => array("",""),
"Help" => "Hulp",
-"Password" => "Wagwoord"
+"Password" => "Wagwoord",
+"Continue" => "Gaan voort"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_ldap/l10n/en_GB.php b/apps/user_ldap/l10n/en_GB.php
index 6dfc3e53f0c..cb0ac1a5497 100644
--- a/apps/user_ldap/l10n/en_GB.php
+++ b/apps/user_ldap/l10n/en_GB.php
@@ -70,6 +70,7 @@ $TRANSLATIONS = array(
"Backup (Replica) Port" => "Backup (Replica) Port",
"Disable Main Server" => "Disable Main Server",
"Only connect to the replica server." => "Only connect to the replica server.",
+"Case insensitive LDAP server (Windows)" => "Case insensitive LDAP server (Windows)",
"Turn off SSL certificate validation." => "Turn off SSL certificate validation.",
"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." => "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.",
"Cache Time-To-Live" => "Cache Time-To-Live",
diff --git a/apps/user_ldap/l10n/es.php b/apps/user_ldap/l10n/es.php
index 2c294aff785..bb1c9acb2ab 100644
--- a/apps/user_ldap/l10n/es.php
+++ b/apps/user_ldap/l10n/es.php
@@ -90,6 +90,8 @@ $TRANSLATIONS = array(
"Group-Member association" => "Asociación Grupo-Miembro",
"Nested Groups" => "Grupos anidados",
"When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" => "Cuando se active, se permitirán grupos que contenga otros grupos (solo funciona si el atributo de miembro de grupo contiene DNs).",
+"Paging chunksize" => "Tamaño de los fragmentos de paginación",
+"Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" => "Tamaño de los fragmentos usado para búsquedas LDAP paginadas que pueden devolver resultados voluminosos, como enumeración de usuarios o de grupos. (Si se establece en 0, se deshabilitan las búsquedas LDAP paginadas en esas situaciones.)",
"Special Attributes" => "Atributos especiales",
"Quota Field" => "Cuota",
"Quota Default" => "Cuota por defecto",
diff --git a/apps/user_ldap/l10n/es_AR.php b/apps/user_ldap/l10n/es_AR.php
index 877141bcdc8..4a8047c6d91 100644
--- a/apps/user_ldap/l10n/es_AR.php
+++ b/apps/user_ldap/l10n/es_AR.php
@@ -33,12 +33,14 @@ $TRANSLATIONS = array(
"Save" => "Guardar",
"Test Configuration" => "Probar configuración",
"Help" => "Ayuda",
+"Groups meeting these criteria are available in %s:" => "Los grupos que cumplen con estos criterios están disponibles en %s:",
"only those object classes:" => "solo estos objetos de clases:",
"only from those groups:" => "solo provenientes de estos grupos:",
"Edit raw filter instead" => "Editar filtro en bruto",
"Raw LDAP filter" => "Filtro LDAP en bruto",
"The filter specifies which LDAP groups shall have access to the %s instance." => "El filtro especifica qué grupos LDAP deben tener acceso a la instancia %s.",
"groups found" => "grupos encontrados",
+"Users login with this attribute:" => "Los usuarios inician sesión con este atributo:",
"LDAP Username:" => "Nombre de usuario LDAP:",
"LDAP Email Address:" => "Correo electrónico LDAP:",
"Other Attributes:" => "Otros atributos:",
@@ -53,6 +55,7 @@ $TRANSLATIONS = array(
"For anonymous access, leave DN and Password empty." => "Para acceso anónimo, dejá DN y contraseña vacíos.",
"One Base DN per line" => "Una DN base por línea",
"You can specify Base DN for users and groups in the Advanced tab" => "Podés especificar el DN base para usuarios y grupos en la pestaña \"Avanzado\"",
+"Limit %s access to users meeting these criteria:" => "Limitar acceso %s a los usuarios que cumplen con este criterio:",
"The filter specifies which LDAP users shall have access to the %s instance." => "El filtro especifica cuáles usuarios LDAP deben tener acceso a la instancia %s.",
"users found" => "usuarios encontrados",
"Back" => "Volver",
@@ -67,6 +70,7 @@ $TRANSLATIONS = array(
"Backup (Replica) Port" => "Puerto para copia de seguridad (réplica)",
"Disable Main Server" => "Deshabilitar el Servidor Principal",
"Only connect to the replica server." => "Conectarse únicamente al servidor de réplica.",
+"Case insensitive LDAP server (Windows)" => "Servidor de LDAP insensible a mayúsculas/minúsculas (Windows)",
"Turn off SSL certificate validation." => "Desactivar la validación por certificado SSL.",
"Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." => "No es recomendado, ¡Usalo solamente para pruebas! Si la conexión únicamente funciona con esta opción, importá el certificado SSL del servidor LDAP en tu servidor %s.",
"Cache Time-To-Live" => "Tiempo de vida del caché",
@@ -84,6 +88,9 @@ $TRANSLATIONS = array(
"One Group Base DN per line" => "Una DN base de grupo por línea",
"Group Search Attributes" => "Atributos de búsqueda de grupo",
"Group-Member association" => "Asociación Grupo-Miembro",
+"Nested Groups" => "Grupos Anidados",
+"When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" => "Cuando se activa, grupos que contienen grupos son soportados. (Solo funciona si el atributo de miembro del grupo contiene DNs)",
+"Paging chunksize" => "Tamaño del fragmento de paginación",
"Special Attributes" => "Atributos Especiales",
"Quota Field" => "Campo de cuota",
"Quota Default" => "Cuota por defecto",
diff --git a/apps/user_ldap/l10n/es_CR.php b/apps/user_ldap/l10n/es_CR.php
new file mode 100644
index 00000000000..3a1e002311c
--- /dev/null
+++ b/apps/user_ldap/l10n/es_CR.php
@@ -0,0 +1,6 @@
+<?php
+$TRANSLATIONS = array(
+"_%s group found_::_%s groups found_" => array("",""),
+"_%s user found_::_%s users found_" => array("","")
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_ldap/l10n/et_EE.php b/apps/user_ldap/l10n/et_EE.php
index f52449bda8b..11941bf4ac9 100644
--- a/apps/user_ldap/l10n/et_EE.php
+++ b/apps/user_ldap/l10n/et_EE.php
@@ -70,6 +70,7 @@ $TRANSLATIONS = array(
"Backup (Replica) Port" => "Varuserveri (replika) port",
"Disable Main Server" => "Ära kasuta peaserverit",
"Only connect to the replica server." => "Ühendu ainult replitseeriva serveriga.",
+"Case insensitive LDAP server (Windows)" => "Tõusutundetu LDAP server (Windows)",
"Turn off SSL certificate validation." => "Lülita SSL sertifikaadi kontrollimine välja.",
"Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." => "Pole soovitatav, kasuta seda ainult testimiseks! Kui ühendus toimib ainult selle valikuga, siis impordi LDAP serveri SSL sertifikaat oma %s serverisse.",
"Cache Time-To-Live" => "Puhvri iga",
diff --git a/apps/user_ldap/l10n/ia.php b/apps/user_ldap/l10n/ia.php
index e138fd835f1..b29ecbb1d24 100644
--- a/apps/user_ldap/l10n/ia.php
+++ b/apps/user_ldap/l10n/ia.php
@@ -7,6 +7,7 @@ $TRANSLATIONS = array(
"Save" => "Salveguardar",
"Help" => "Adjuta",
"Password" => "Contrasigno",
-"Back" => "Retro"
+"Back" => "Retro",
+"Continue" => "Continuar"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_ldap/l10n/or_IN.php b/apps/user_ldap/l10n/or_IN.php
new file mode 100644
index 00000000000..3a1e002311c
--- /dev/null
+++ b/apps/user_ldap/l10n/or_IN.php
@@ -0,0 +1,6 @@
+<?php
+$TRANSLATIONS = array(
+"_%s group found_::_%s groups found_" => array("",""),
+"_%s user found_::_%s users found_" => array("","")
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_ldap/l10n/sk_SK.php b/apps/user_ldap/l10n/sk_SK.php
index edda4244336..3c6b51824f4 100644
--- a/apps/user_ldap/l10n/sk_SK.php
+++ b/apps/user_ldap/l10n/sk_SK.php
@@ -33,12 +33,14 @@ $TRANSLATIONS = array(
"Save" => "Uložiť",
"Test Configuration" => "Test nastavenia",
"Help" => "Pomoc",
+"Groups meeting these criteria are available in %s:" => "Skupiny spĺňajúce tieto kritériá sú k dispozícii v %s:",
"only those object classes:" => "len tieto triedy objektov:",
"only from those groups:" => "len z týchto skupín:",
"Edit raw filter instead" => "Miesto pre úpravu raw filtra",
"Raw LDAP filter" => "Raw LDAP filter",
"The filter specifies which LDAP groups shall have access to the %s instance." => "Tento filter LDAP určuje, ktoré skupiny budú mať prístup k %s inštancii.",
"groups found" => "nájdené skupiny",
+"Users login with this attribute:" => "Používateľov prihlásiť pomocou tohto atribútu:",
"LDAP Username:" => "LDAP používateľské meno:",
"LDAP Email Address:" => "LDAP emailová adresa:",
"Other Attributes:" => "Iné atribúty:",
@@ -53,6 +55,7 @@ $TRANSLATIONS = array(
"For anonymous access, leave DN and Password empty." => "Pre anonymný prístup ponechajte údaje DN a Heslo prázdne.",
"One Base DN per line" => "Jedno základné DN na riadok",
"You can specify Base DN for users and groups in the Advanced tab" => "V rozšírenom nastavení môžete zadať základné DN pre používateľov a skupiny",
+"Limit %s access to users meeting these criteria:" => "Obmedziť %s prístup na používateľov spĺňajúcich tieto kritériá:",
"The filter specifies which LDAP users shall have access to the %s instance." => "Tento filter LDAP určuje, ktorí používatelia majú prístup k %s inštancii.",
"users found" => "nájdení používatelia",
"Back" => "Späť",
@@ -67,6 +70,7 @@ $TRANSLATIONS = array(
"Backup (Replica) Port" => "Záložný server (kópia) port",
"Disable Main Server" => "Zakázať hlavný server",
"Only connect to the replica server." => "Pripojiť sa len k záložnému serveru.",
+"Case insensitive LDAP server (Windows)" => "LDAP server je citlivý na veľkosť písmen (Windows)",
"Turn off SSL certificate validation." => "Vypnúť overovanie SSL certifikátu.",
"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." => "Neodporúčané, použite iba pri testovaní! Pokiaľ spojenie funguje iba z daným nastavením, importujte SSL certifikát LDAP servera do vášho %s servera.",
"Cache Time-To-Live" => "Životnosť objektov vo vyrovnávacej pamäti",
@@ -84,6 +88,7 @@ $TRANSLATIONS = array(
"One Group Base DN per line" => "Jedna skupinová základná DN na riadok",
"Group Search Attributes" => "Atribúty vyhľadávania skupín",
"Group-Member association" => "Priradenie člena skupiny",
+"Nested Groups" => "Vnorené skupiny",
"Special Attributes" => "Špeciálne atribúty",
"Quota Field" => "Pole kvóty",
"Quota Default" => "Predvolená kvóta",
diff --git a/apps/user_ldap/lib/access.php b/apps/user_ldap/lib/access.php
index 8d622dcb794..712407505fb 100644
--- a/apps/user_ldap/lib/access.php
+++ b/apps/user_ldap/lib/access.php
@@ -63,7 +63,6 @@ class Access extends LDAPUtility {
return false;
}
//all or nothing! otherwise we get in trouble with.
- $this->initPagedSearch($filter, array($dn), $attr, 99999, 0);
$dn = $this->DNasBaseParameter($dn);
$rr = @$this->ldap->read($cr, $dn, $filter, array($attr));
if(!$this->ldap->isResource($rr)) {
@@ -434,6 +433,11 @@ class Access extends LDAPUtility {
$ocname = $this->dn2ocname($ldapObject['dn'], $nameByLDAP, $isUsers);
if($ocname) {
$ownCloudNames[] = $ocname;
+ if($isUsers) {
+ //cache the user names so it does not need to be retrieved
+ //again later (e.g. sharing dialogue).
+ $this->cacheUserDisplayName($ocname, $nameByLDAP);
+ }
}
continue;
}
@@ -441,6 +445,16 @@ class Access extends LDAPUtility {
}
/**
+ * @brief caches the user display name
+ * @param string the internal owncloud username
+ * @param string the display name
+ */
+ public function cacheUserDisplayName($ocname, $displayName) {
+ $cacheKeyTrunk = 'getDisplayName';
+ $this->connection->writeToCache($cacheKeyTrunk.$ocname, $displayName);
+ }
+
+ /**
* @brief creates a unique name for internal ownCloud use for users. Don't call it directly.
* @param $name the display name of the object
* @returns string with with the name to use in ownCloud or false if unsuccessful
@@ -707,6 +721,9 @@ class Access extends LDAPUtility {
$linkResources = array_pad(array(), count($base), $cr);
$sr = $this->ldap->search($linkResources, $base, $filter, $attr);
$error = $this->ldap->errno($cr);
+ if ($pagedSearchOK) {
+ $this->ldap->controlPagedResult($cr, 999999, false, "");
+ }
if(!is_array($sr) || $error !== 0) {
\OCP\Util::writeLog('user_ldap',
'Error when searching: '.$this->ldap->error($cr).
@@ -1261,9 +1278,9 @@ class Access extends LDAPUtility {
if($this->connection->hasPagedResultSupport && !is_null($limit)) {
$offset = intval($offset); //can be null
\OCP\Util::writeLog('user_ldap',
- 'initializing paged search for Filter'.$filter.' base '.print_r($bases, true)
+ 'initializing paged search for Filter '.$filter.' base '.print_r($bases, true)
.' attr '.print_r($attr, true). ' limit ' .$limit.' offset '.$offset,
- \OCP\Util::INFO);
+ \OCP\Util::DEBUG);
//get the cookie from the search for the previous search, required by LDAP
foreach($bases as $base) {
@@ -1285,7 +1302,7 @@ class Access extends LDAPUtility {
}
if(!is_null($cookie)) {
if($offset > 0) {
- \OCP\Util::writeLog('user_ldap', 'Cookie '.$cookie, \OCP\Util::INFO);
+ \OCP\Util::writeLog('user_ldap', 'Cookie '.CRC32($cookie), \OCP\Util::INFO);
}
$pagedSearchOK = $this->ldap->controlPagedResult(
$this->connection->getConnectionResource(), $limit,
diff --git a/apps/user_ldap/lib/ldap.php b/apps/user_ldap/lib/ldap.php
index de9b7481c19..d1ca91045b2 100644
--- a/apps/user_ldap/lib/ldap.php
+++ b/apps/user_ldap/lib/ldap.php
@@ -139,7 +139,9 @@ class LDAP implements ILDAPWrapper {
if(function_exists($func)) {
$this->preFunctionCall($func, $arguments);
$result = call_user_func_array($func, $arguments);
- $this->postFunctionCall();
+ if ($result === FALSE) {
+ $this->postFunctionCall();
+ }
return $result;
}
}
diff --git a/apps/user_ldap/lib/wizard.php b/apps/user_ldap/lib/wizard.php
index 8ddee8c760c..8406b2d42a5 100644
--- a/apps/user_ldap/lib/wizard.php
+++ b/apps/user_ldap/lib/wizard.php
@@ -799,6 +799,7 @@ class Wizard extends LDAPUtility {
\OCP\Util::writeLog('user_ldap', 'Wiz: Setting LDAP Options ', \OCP\Util::DEBUG);
//set LDAP options
$this->ldap->setOption($cr, LDAP_OPT_PROTOCOL_VERSION, 3);
+ $this->ldap->setOption($cr, LDAP_OPT_REFERRALS, 0);
$this->ldap->setOption($cr, LDAP_OPT_NETWORK_TIMEOUT, self::LDAP_NW_TIMEOUT);
if($tls) {
$isTlsWorking = @$this->ldap->startTls($cr);
diff --git a/apps/user_ldap/settings.php b/apps/user_ldap/settings.php
index d077eafdde9..6b7d8e6f53e 100644
--- a/apps/user_ldap/settings.php
+++ b/apps/user_ldap/settings.php
@@ -25,6 +25,7 @@
OC_Util::checkAdminUser();
+OCP\Util::addScript('user_ldap', 'ldapFilter');
OCP\Util::addScript('user_ldap', 'settings');
OCP\Util::addScript('core', 'jquery.multiselect');
OCP\Util::addStyle('user_ldap', 'settings');