diff options
Diffstat (limited to 'apps/files_sharing')
24 files changed, 253 insertions, 61 deletions
diff --git a/apps/files_sharing/appinfo/application.php b/apps/files_sharing/appinfo/application.php index 9587d74f160..9dc0e0618b5 100644 --- a/apps/files_sharing/appinfo/application.php +++ b/apps/files_sharing/appinfo/application.php @@ -120,6 +120,17 @@ class Application extends App { ); }); + $container->registerService('ExternalMountProvider', function (IContainer $c) { + /** @var \OCP\IServerContainer $server */ + $server = $c->query('ServerContainer'); + return new \OCA\Files_Sharing\External\MountProvider( + $server->getDatabaseConnection(), + function() use ($c) { + return $c->query('ExternalManager'); + } + ); + }); + $container->registerService('PropagationManager', function (IContainer $c) { /** @var \OCP\IServerContainer $server */ $server = $c->query('ServerContainer'); @@ -150,6 +161,7 @@ class Application extends App { $server = $this->getContainer()->query('ServerContainer'); $mountProviderCollection = $server->getMountProviderCollection(); $mountProviderCollection->registerProvider($this->getContainer()->query('MountProvider')); + $mountProviderCollection->registerProvider($this->getContainer()->query('ExternalMountProvider')); } public function setupPropagation() { diff --git a/apps/files_sharing/l10n/cs_CZ.js b/apps/files_sharing/l10n/cs_CZ.js index be924134ae2..7c52f1c21ff 100644 --- a/apps/files_sharing/l10n/cs_CZ.js +++ b/apps/files_sharing/l10n/cs_CZ.js @@ -43,6 +43,14 @@ OC.L10N.register( "%2$s shared %1$s via link" : "%2$s nasdílel(a) %1$s jako odkaz", "%2$s shared %1$s with you" : "%2$s s vámi sdílí %1$s", "You shared %1$s via link" : "Sdílíte %1$s přes odkaz", + "Downloaded via public link" : "Staženo pomocí veřejného odkazu", + "Shared with %2$s" : "Sdíleno s %2$s", + "Shared with group %2$s" : "Sdíleno se skupinou %2$s", + "Shared with %3$s by %2$s" : "%2$s sdílí s %3$s", + "Shared with group %3$s by %2$s" : "%2$s sdílí se skupinou %3$s", + "Shared via link by %2$s" : "%2$s sdílel(a) jako odkaz", + "Shared by %2$s" : "%2$s sdílel(a)", + "Shared via public link" : "Sdíleno jako veřejný odkaz", "Shares" : "Sdílení", "Accept" : "Přijmout", "Decline" : "Zamítnout", diff --git a/apps/files_sharing/l10n/cs_CZ.json b/apps/files_sharing/l10n/cs_CZ.json index a889bbc1235..0e139f7bbf5 100644 --- a/apps/files_sharing/l10n/cs_CZ.json +++ b/apps/files_sharing/l10n/cs_CZ.json @@ -41,6 +41,14 @@ "%2$s shared %1$s via link" : "%2$s nasdílel(a) %1$s jako odkaz", "%2$s shared %1$s with you" : "%2$s s vámi sdílí %1$s", "You shared %1$s via link" : "Sdílíte %1$s přes odkaz", + "Downloaded via public link" : "Staženo pomocí veřejného odkazu", + "Shared with %2$s" : "Sdíleno s %2$s", + "Shared with group %2$s" : "Sdíleno se skupinou %2$s", + "Shared with %3$s by %2$s" : "%2$s sdílí s %3$s", + "Shared with group %3$s by %2$s" : "%2$s sdílí se skupinou %3$s", + "Shared via link by %2$s" : "%2$s sdílel(a) jako odkaz", + "Shared by %2$s" : "%2$s sdílel(a)", + "Shared via public link" : "Sdíleno jako veřejný odkaz", "Shares" : "Sdílení", "Accept" : "Přijmout", "Decline" : "Zamítnout", diff --git a/apps/files_sharing/l10n/el.js b/apps/files_sharing/l10n/el.js index 6f71bdc2832..e4024492b65 100644 --- a/apps/files_sharing/l10n/el.js +++ b/apps/files_sharing/l10n/el.js @@ -43,6 +43,14 @@ OC.L10N.register( "%2$s shared %1$s via link" : "Ο %2$s διαμοιράστηκε το %1$s μέσω συνδέσμου", "%2$s shared %1$s with you" : "Ο %2$s διαμοιράστηκε το %1$s με εσάς", "You shared %1$s via link" : "Μοιραστήκατε το %1$s μέσω συνδέσμου", + "Downloaded via public link" : "Μεταφορτώθηκε μέσω δημόσιου συνδέσμου", + "Shared with %2$s" : "Διαμοιράστηκε με %2$s", + "Shared with group %2$s" : "Διαμοιράστηκε με την ομάδα %2$s", + "Shared with %3$s by %2$s" : "Διαμοιράστηκε με %3$s από %2$s", + "Shared with group %3$s by %2$s" : "Διαμοιράστηκε με την ομάδα %3$s από %2$s", + "Shared via link by %2$s" : "Διαμοιράστηκε μέσω συνδέσμου από %2$s", + "Shared by %2$s" : "Διαμοιράστηκε από %2$s", + "Shared via public link" : "Διαμοιράστηκε μέσω δημόσιου συνδέσμου", "Shares" : "Κοινόχρηστοι φάκελοι", "You received %2$s as a remote share from %1$s" : "Λάβατε το %2$s ως απομακρυσμένο διαμοιρασμό από %1$s", "Accept" : "Αποδοχή", diff --git a/apps/files_sharing/l10n/el.json b/apps/files_sharing/l10n/el.json index c1bdc039f9d..7bf5c00841e 100644 --- a/apps/files_sharing/l10n/el.json +++ b/apps/files_sharing/l10n/el.json @@ -41,6 +41,14 @@ "%2$s shared %1$s via link" : "Ο %2$s διαμοιράστηκε το %1$s μέσω συνδέσμου", "%2$s shared %1$s with you" : "Ο %2$s διαμοιράστηκε το %1$s με εσάς", "You shared %1$s via link" : "Μοιραστήκατε το %1$s μέσω συνδέσμου", + "Downloaded via public link" : "Μεταφορτώθηκε μέσω δημόσιου συνδέσμου", + "Shared with %2$s" : "Διαμοιράστηκε με %2$s", + "Shared with group %2$s" : "Διαμοιράστηκε με την ομάδα %2$s", + "Shared with %3$s by %2$s" : "Διαμοιράστηκε με %3$s από %2$s", + "Shared with group %3$s by %2$s" : "Διαμοιράστηκε με την ομάδα %3$s από %2$s", + "Shared via link by %2$s" : "Διαμοιράστηκε μέσω συνδέσμου από %2$s", + "Shared by %2$s" : "Διαμοιράστηκε από %2$s", + "Shared via public link" : "Διαμοιράστηκε μέσω δημόσιου συνδέσμου", "Shares" : "Κοινόχρηστοι φάκελοι", "You received %2$s as a remote share from %1$s" : "Λάβατε το %2$s ως απομακρυσμένο διαμοιρασμό από %1$s", "Accept" : "Αποδοχή", diff --git a/apps/files_sharing/l10n/fa.js b/apps/files_sharing/l10n/fa.js index 29cd5818d40..cd915b79a17 100644 --- a/apps/files_sharing/l10n/fa.js +++ b/apps/files_sharing/l10n/fa.js @@ -3,18 +3,22 @@ OC.L10N.register( { "Server to server sharing is not enabled on this server" : "اشتراک سرور به سرور در این سرور فعال نیست .", "Invalid or untrusted SSL certificate" : "گواهینامه SSL غیر قابل اعتماد یا غیر معتبر است.", + "Could not authenticate to remote share, password might be wrong" : "احرازهویت برای اشتراکگذاری راهدور انجام نشد، احتمالا رمزعبور نادرست است", "Storage not valid" : "فضای ذخیرهسازی معتبر نیست", "Couldn't add remote share" : "امکان افزودن اشتراک گذاری از راه دور وجود ندارد", "Shared with you" : "موارد به اشتراک گذاشته شده با شما", "Shared with others" : "موارد به اشتراک گذاشته شده با دیگران", "Shared by link" : "اشتراک گذاشته شده از طریق پیوند", + "Nothing shared with you yet" : "هیچ موردی با شما به اشتراک گذاشته نشده است", "Nothing shared yet" : "هیچ موردی تاکنون به اشتراک گذاشته نشده است", "No shared links" : "هیچ لینک اشتراکگذاری وجود ندارد", + "Files and folders you share by link will show up here" : "فایلها و پوشههای اشتراکگذاشته توسط شما همراه با لینک در اینجا نمایش داده خواهد شد", "Do you want to add the remote share {name} from {owner}@{remote}?" : "آیا مایل به افزودن اشتراک از راه دور {name} از {owner}@{remote} هستید.", "Remote share" : "اشتراک از راه دور", "Remote share password" : "رمز عبور اشتراک از راه دور", "Cancel" : "منصرف شدن", "Add remote share" : "افزودن اشتراک از راه دور", + "You can upload into this folder" : "میتوانید در این پوشه آپلود کنید", "Invalid ownCloud url" : "آدرس نمونه ownCloud غیر معتبر است", "Shared by" : "اشتراک گذاشته شده به وسیله", "Sharing" : "اشتراک گذاری", diff --git a/apps/files_sharing/l10n/fa.json b/apps/files_sharing/l10n/fa.json index 64d03e5186a..a345d9f1401 100644 --- a/apps/files_sharing/l10n/fa.json +++ b/apps/files_sharing/l10n/fa.json @@ -1,18 +1,22 @@ { "translations": { "Server to server sharing is not enabled on this server" : "اشتراک سرور به سرور در این سرور فعال نیست .", "Invalid or untrusted SSL certificate" : "گواهینامه SSL غیر قابل اعتماد یا غیر معتبر است.", + "Could not authenticate to remote share, password might be wrong" : "احرازهویت برای اشتراکگذاری راهدور انجام نشد، احتمالا رمزعبور نادرست است", "Storage not valid" : "فضای ذخیرهسازی معتبر نیست", "Couldn't add remote share" : "امکان افزودن اشتراک گذاری از راه دور وجود ندارد", "Shared with you" : "موارد به اشتراک گذاشته شده با شما", "Shared with others" : "موارد به اشتراک گذاشته شده با دیگران", "Shared by link" : "اشتراک گذاشته شده از طریق پیوند", + "Nothing shared with you yet" : "هیچ موردی با شما به اشتراک گذاشته نشده است", "Nothing shared yet" : "هیچ موردی تاکنون به اشتراک گذاشته نشده است", "No shared links" : "هیچ لینک اشتراکگذاری وجود ندارد", + "Files and folders you share by link will show up here" : "فایلها و پوشههای اشتراکگذاشته توسط شما همراه با لینک در اینجا نمایش داده خواهد شد", "Do you want to add the remote share {name} from {owner}@{remote}?" : "آیا مایل به افزودن اشتراک از راه دور {name} از {owner}@{remote} هستید.", "Remote share" : "اشتراک از راه دور", "Remote share password" : "رمز عبور اشتراک از راه دور", "Cancel" : "منصرف شدن", "Add remote share" : "افزودن اشتراک از راه دور", + "You can upload into this folder" : "میتوانید در این پوشه آپلود کنید", "Invalid ownCloud url" : "آدرس نمونه ownCloud غیر معتبر است", "Shared by" : "اشتراک گذاشته شده به وسیله", "Sharing" : "اشتراک گذاری", diff --git a/apps/files_sharing/l10n/hu_HU.js b/apps/files_sharing/l10n/hu_HU.js index 7b85e236b44..c0d2d01b2c4 100644 --- a/apps/files_sharing/l10n/hu_HU.js +++ b/apps/files_sharing/l10n/hu_HU.js @@ -43,6 +43,14 @@ OC.L10N.register( "%2$s shared %1$s via link" : "%2$s megosztotta ezt: %1$s, hivatkozással", "%2$s shared %1$s with you" : "%2$s megosztotta velem ezt: %1$s", "You shared %1$s via link" : "Megosztottam link segítségével: %1$s", + "Downloaded via public link" : "Letöltve publikus hivatkozással", + "Shared with %2$s" : "Megosztva vele: %2$s", + "Shared with group %2$s" : "Megosztva ezzel a csoporttal: %2$s", + "Shared with %3$s by %2$s" : "Megosztva vele: %3$s, megosztó: %2$s", + "Shared with group %3$s by %2$s" : "Megosztva ezzel a csoporttal: %3$s, megosztó: %2$s", + "Shared via link by %2$s" : "Megosztva hivatkozással: %2$s", + "Shared by %2$s" : "Megosztó: %2$s", + "Shared via public link" : "Megosztva publikus hivatkozással", "Shares" : "Megosztások", "You received %2$s as a remote share from %1$s" : "Kaptál egy távoli megosztást: %2$s, innen: %1$s", "Accept" : "Elfogadás", diff --git a/apps/files_sharing/l10n/hu_HU.json b/apps/files_sharing/l10n/hu_HU.json index c749a5add97..a2e15c46c52 100644 --- a/apps/files_sharing/l10n/hu_HU.json +++ b/apps/files_sharing/l10n/hu_HU.json @@ -41,6 +41,14 @@ "%2$s shared %1$s via link" : "%2$s megosztotta ezt: %1$s, hivatkozással", "%2$s shared %1$s with you" : "%2$s megosztotta velem ezt: %1$s", "You shared %1$s via link" : "Megosztottam link segítségével: %1$s", + "Downloaded via public link" : "Letöltve publikus hivatkozással", + "Shared with %2$s" : "Megosztva vele: %2$s", + "Shared with group %2$s" : "Megosztva ezzel a csoporttal: %2$s", + "Shared with %3$s by %2$s" : "Megosztva vele: %3$s, megosztó: %2$s", + "Shared with group %3$s by %2$s" : "Megosztva ezzel a csoporttal: %3$s, megosztó: %2$s", + "Shared via link by %2$s" : "Megosztva hivatkozással: %2$s", + "Shared by %2$s" : "Megosztó: %2$s", + "Shared via public link" : "Megosztva publikus hivatkozással", "Shares" : "Megosztások", "You received %2$s as a remote share from %1$s" : "Kaptál egy távoli megosztást: %2$s, innen: %1$s", "Accept" : "Elfogadás", diff --git a/apps/files_sharing/l10n/nds.js b/apps/files_sharing/l10n/nds.js new file mode 100644 index 00000000000..e263ab143a8 --- /dev/null +++ b/apps/files_sharing/l10n/nds.js @@ -0,0 +1,8 @@ +OC.L10N.register( + "files_sharing", + { + "Cancel" : "Abbrechen", + "Password" : "Passwort", + "Name" : "Name" +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/files_sharing/l10n/nds.json b/apps/files_sharing/l10n/nds.json new file mode 100644 index 00000000000..15e6870cb0e --- /dev/null +++ b/apps/files_sharing/l10n/nds.json @@ -0,0 +1,6 @@ +{ "translations": { + "Cancel" : "Abbrechen", + "Password" : "Passwort", + "Name" : "Name" +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/files_sharing/l10n/ru.js b/apps/files_sharing/l10n/ru.js index 2d89b5e3102..1a84d10ecea 100644 --- a/apps/files_sharing/l10n/ru.js +++ b/apps/files_sharing/l10n/ru.js @@ -38,10 +38,23 @@ OC.L10N.register( "Public shared file %1$s was downloaded" : "Общий файл %1$s, был скачан", "You shared %1$s with %2$s" : "Вы поделились %1$s с %2$s", "You shared %1$s with group %2$s" : "Вы поделились %1$s с группой %2$s", + "%2$s shared %1$s with %3$s" : "%2$s поделился %1$s с %3$s", + "%2$s shared %1$s with group %3$s" : "%2$s поделился %1$s с группой %3$s", + "%2$s shared %1$s via link" : "%2$s поделился %1$s по ссылке", "%2$s shared %1$s with you" : "%2$s поделился с вами %1$s", "You shared %1$s via link" : "Вы поделились %1$s с помощью ссылки", + "Downloaded via public link" : "Загружено по открытой ссылке", + "Shared with %2$s" : "Поделился с %2$s", + "Shared with group %2$s" : "Поделился с группой %2$s", + "Shared with %3$s by %2$s" : "Поделился %2$s с %3$s", + "Shared with group %3$s by %2$s" : "Поделился %2$s с группой %3$s", + "Shared via link by %2$s" : "Поделился ссылкой %2$s", + "Shared by %2$s" : "Поделился %2$s", + "Shared via public link" : "Поделился открытой ссылкой", "Shares" : "События обмена файлами", + "You received %2$s as a remote share from %1$s" : "Вы получили %2$s через удаленный общий ресурс %1$s", "Accept" : "Принять", + "Decline" : "Отклонить", "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Поделитесь со мной через мой #ownCloud ID в объединении облачных хранилищ, смотрите %s", "Share with me through my #ownCloud Federated Cloud ID" : "Поделитесь со мной через мой #ownCloud ID в объединении облачных хранилищ", "This share is password-protected" : "Общий ресурс защищен паролем", @@ -67,6 +80,7 @@ OC.L10N.register( "Federated Cloud" : "Объединение облачных хранилищ", "Your Federated Cloud ID:" : "Ваш ID в объединении облачных хранилищ:", "Share it:" : "Поделись этим:", + "Add to your website" : "Добавить к себе на сайт", "Share with me via ownCloud" : "Поделитесь мной через ownCloud", "HTML Code:" : "HTML код:" }, diff --git a/apps/files_sharing/l10n/ru.json b/apps/files_sharing/l10n/ru.json index 0f7a152f536..401896709d6 100644 --- a/apps/files_sharing/l10n/ru.json +++ b/apps/files_sharing/l10n/ru.json @@ -36,10 +36,23 @@ "Public shared file %1$s was downloaded" : "Общий файл %1$s, был скачан", "You shared %1$s with %2$s" : "Вы поделились %1$s с %2$s", "You shared %1$s with group %2$s" : "Вы поделились %1$s с группой %2$s", + "%2$s shared %1$s with %3$s" : "%2$s поделился %1$s с %3$s", + "%2$s shared %1$s with group %3$s" : "%2$s поделился %1$s с группой %3$s", + "%2$s shared %1$s via link" : "%2$s поделился %1$s по ссылке", "%2$s shared %1$s with you" : "%2$s поделился с вами %1$s", "You shared %1$s via link" : "Вы поделились %1$s с помощью ссылки", + "Downloaded via public link" : "Загружено по открытой ссылке", + "Shared with %2$s" : "Поделился с %2$s", + "Shared with group %2$s" : "Поделился с группой %2$s", + "Shared with %3$s by %2$s" : "Поделился %2$s с %3$s", + "Shared with group %3$s by %2$s" : "Поделился %2$s с группой %3$s", + "Shared via link by %2$s" : "Поделился ссылкой %2$s", + "Shared by %2$s" : "Поделился %2$s", + "Shared via public link" : "Поделился открытой ссылкой", "Shares" : "События обмена файлами", + "You received %2$s as a remote share from %1$s" : "Вы получили %2$s через удаленный общий ресурс %1$s", "Accept" : "Принять", + "Decline" : "Отклонить", "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Поделитесь со мной через мой #ownCloud ID в объединении облачных хранилищ, смотрите %s", "Share with me through my #ownCloud Federated Cloud ID" : "Поделитесь со мной через мой #ownCloud ID в объединении облачных хранилищ", "This share is password-protected" : "Общий ресурс защищен паролем", @@ -65,6 +78,7 @@ "Federated Cloud" : "Объединение облачных хранилищ", "Your Federated Cloud ID:" : "Ваш ID в объединении облачных хранилищ:", "Share it:" : "Поделись этим:", + "Add to your website" : "Добавить к себе на сайт", "Share with me via ownCloud" : "Поделитесь мной через ownCloud", "HTML Code:" : "HTML код:" },"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);" diff --git a/apps/files_sharing/l10n/zh_TW.js b/apps/files_sharing/l10n/zh_TW.js index a5f97c92092..bc49d1d8a48 100644 --- a/apps/files_sharing/l10n/zh_TW.js +++ b/apps/files_sharing/l10n/zh_TW.js @@ -35,6 +35,7 @@ OC.L10N.register( "Add to your ownCloud" : "加入到你的 ownCloud", "Download" : "下載", "Download %s" : "下載 %s", - "Direct link" : "直接連結" + "Direct link" : "直接連結", + "Federated Cloud Sharing" : "聯盟式雲端分享" }, "nplurals=1; plural=0;"); diff --git a/apps/files_sharing/l10n/zh_TW.json b/apps/files_sharing/l10n/zh_TW.json index 67150e495b9..3567ed51df4 100644 --- a/apps/files_sharing/l10n/zh_TW.json +++ b/apps/files_sharing/l10n/zh_TW.json @@ -33,6 +33,7 @@ "Add to your ownCloud" : "加入到你的 ownCloud", "Download" : "下載", "Download %s" : "下載 %s", - "Direct link" : "直接連結" + "Direct link" : "直接連結", + "Federated Cloud Sharing" : "聯盟式雲端分享" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/files_sharing/lib/external/manager.php b/apps/files_sharing/lib/external/manager.php index ab6a02f94a1..86b8904cc9a 100644 --- a/apps/files_sharing/lib/external/manager.php +++ b/apps/files_sharing/lib/external/manager.php @@ -153,28 +153,6 @@ class Manager { return $this->mountShare($options); } - private function setupMounts() { - // don't setup server-to-server shares if the admin disabled it - if (\OCA\Files_Sharing\Helper::isIncomingServer2serverShareEnabled() === false) { - return false; - } - - if (!is_null($this->uid)) { - $query = $this->connection->prepare(' - SELECT `remote`, `share_token`, `password`, `mountpoint`, `owner` - FROM `*PREFIX*share_external` - WHERE `user` = ? AND `accepted` = ? - '); - $query->execute(array($this->uid, 1)); - - while ($row = $query->fetch()) { - $row['manager'] = $this; - $row['token'] = $row['share_token']; - $this->mountShare($row); - } - } - } - /** * get share * @@ -277,24 +255,6 @@ class Manager { } /** - * setup the server-to-server mounts - * - * @param array $params - */ - public static function setup(array $params) { - $externalManager = new \OCA\Files_Sharing\External\Manager( - \OC::$server->getDatabaseConnection(), - \OC\Files\Filesystem::getMountManager(), - \OC\Files\Filesystem::getLoader(), - \OC::$server->getHTTPHelper(), - \OC::$server->getNotificationManager(), - $params['user'] - ); - - $externalManager->setupMounts(); - } - - /** * remove '/user/files' from the path and trailing slashes * * @param string $path @@ -305,16 +265,20 @@ class Manager { return rtrim(substr($path, strlen($prefix)), '/'); } + public function getMount($data) { + $data['manager'] = $this; + $mountPoint = '/' . $this->uid . '/files' . $data['mountpoint']; + $data['mountpoint'] = $mountPoint; + $data['certificateManager'] = \OC::$server->getCertificateManager($this->uid); + return new Mount(self::STORAGE, $mountPoint, $data, $this, $this->storageLoader); + } + /** * @param array $data * @return Mount */ protected function mountShare($data) { - $data['manager'] = $this; - $mountPoint = '/' . $this->uid . '/files' . $data['mountpoint']; - $data['mountpoint'] = $mountPoint; - $data['certificateManager'] = \OC::$server->getCertificateManager($this->uid); - $mount = new Mount(self::STORAGE, $mountPoint, $data, $this, $this->storageLoader); + $mount = $this->getMount($data); $this->mountManager->addMount($mount); return $mount; } diff --git a/apps/files_sharing/lib/external/mountprovider.php b/apps/files_sharing/lib/external/mountprovider.php new file mode 100644 index 00000000000..1739cec543f --- /dev/null +++ b/apps/files_sharing/lib/external/mountprovider.php @@ -0,0 +1,75 @@ +<?php +/** + * @author Robin Appelman <icewind@owncloud.com> + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ + +namespace OCA\Files_Sharing\External; + +use OCP\Files\Config\IMountProvider; +use OCP\Files\Storage\IStorageFactory; +use OCP\IDBConnection; +use OCP\IUser; + +class MountProvider implements IMountProvider { + const STORAGE = '\OCA\Files_Sharing\External\Storage'; + + /** + * @var \OCP\IDBConnection + */ + private $connection; + + /** + * @var callable + */ + private $managerProvider; + + /** + * @param \OCP\IDBConnection $connection + * @param callable $managerProvider due to setup order we need a callable that return the manager instead of the manager itself + */ + public function __construct(IDBConnection $connection, callable $managerProvider) { + $this->connection = $connection; + $this->managerProvider = $managerProvider; + } + + public function getMount(IUser $user, $data, IStorageFactory $storageFactory) { + $data['manager'] = $this; + $mountPoint = '/' . $user->getUID() . '/files/' . ltrim($data['mountpoint'], '/'); + $data['mountpoint'] = $mountPoint; + $data['certificateManager'] = \OC::$server->getCertificateManager($user->getUID()); + $managerProvider = $this->managerProvider; + return new Mount(self::STORAGE, $mountPoint, $data, $managerProvider(), $storageFactory); + } + + public function getMountsForUser(IUser $user, IStorageFactory $loader) { + $query = $this->connection->prepare(' + SELECT `remote`, `share_token`, `password`, `mountpoint`, `owner` + FROM `*PREFIX*share_external` + WHERE `user` = ? AND `accepted` = ? + '); + $query->execute([$user->getUID(), 1]); + $mounts = []; + while ($row = $query->fetch()) { + $row['manager'] = $this; + $row['token'] = $row['share_token']; + $mounts[] = $this->getMount($user, $row, $loader); + } + return $mounts; + } +} diff --git a/apps/files_sharing/lib/helper.php b/apps/files_sharing/lib/helper.php index 63648b9f068..b15f70fcde3 100644 --- a/apps/files_sharing/lib/helper.php +++ b/apps/files_sharing/lib/helper.php @@ -31,7 +31,6 @@ namespace OCA\Files_Sharing; class Helper { public static function registerHooks() { - \OCP\Util::connectHook('OC_Filesystem', 'setup', '\OCA\Files_Sharing\External\Manager', 'setup'); \OCP\Util::connectHook('OC_Filesystem', 'delete', '\OC\Files\Cache\Shared_Updater', 'deleteHook'); \OCP\Util::connectHook('OC_Filesystem', 'post_rename', '\OC\Files\Cache\Shared_Updater', 'renameHook'); \OCP\Util::connectHook('OC_Filesystem', 'post_delete', '\OCA\Files_Sharing\Hooks', 'unshareChildren'); diff --git a/apps/files_sharing/lib/propagation/changewatcher.php b/apps/files_sharing/lib/propagation/changewatcher.php index 9da3ffe51a2..e61c161da19 100644 --- a/apps/files_sharing/lib/propagation/changewatcher.php +++ b/apps/files_sharing/lib/propagation/changewatcher.php @@ -99,4 +99,12 @@ class ChangeWatcher { $propagator->propagateChanges(); } } + + public function permissionsHook($params) { + $share = $params['share']; + + if ($share['item_type'] === 'file' || $share['item_type'] === 'folder') { + $this->recipientPropagator->markDirty($share, microtime(true)); + } + } } diff --git a/apps/files_sharing/lib/propagation/propagationmanager.php b/apps/files_sharing/lib/propagation/propagationmanager.php index 35048f89cfb..6ed70e93f84 100644 --- a/apps/files_sharing/lib/propagation/propagationmanager.php +++ b/apps/files_sharing/lib/propagation/propagationmanager.php @@ -25,6 +25,7 @@ use OC\Files\Filesystem; use OC\Files\View; use OCP\IConfig; use OCP\IUserSession; +use OCP\Util; /** @@ -134,8 +135,9 @@ class PropagationManager { // for marking shares owned by the active user as dirty when a file inside them changes $this->listenToOwnerChanges($user->getUID(), $user->getUID()); - \OC_Hook::connect('OC_Filesystem', 'post_write', $watcher, 'writeHook'); - \OC_Hook::connect('OC_Filesystem', 'post_delete', $watcher, 'writeHook'); - \OC_Hook::connect('OC_Filesystem', 'post_rename', $watcher, 'renameHook'); + Util::connectHook('OC_Filesystem', 'post_write', $watcher, 'writeHook'); + Util::connectHook('OC_Filesystem', 'post_delete', $watcher, 'writeHook'); + Util::connectHook('OC_Filesystem', 'post_rename', $watcher, 'renameHook'); + Util::connectHook('OCP\Share', 'post_update_permissions', $watcher, 'permissionsHook'); } } diff --git a/apps/files_sharing/lib/propagation/recipientpropagator.php b/apps/files_sharing/lib/propagation/recipientpropagator.php index 420cacb3d2f..8e064e2ee54 100644 --- a/apps/files_sharing/lib/propagation/recipientpropagator.php +++ b/apps/files_sharing/lib/propagation/recipientpropagator.php @@ -105,7 +105,7 @@ class RecipientPropagator { /** * @param array $share - * @param int $time + * @param float $time */ public function markDirty($share, $time = null) { if ($time === null) { diff --git a/apps/files_sharing/lib/sharedstorage.php b/apps/files_sharing/lib/sharedstorage.php index 27dd2f1e485..b0e56f5f054 100644 --- a/apps/files_sharing/lib/sharedstorage.php +++ b/apps/files_sharing/lib/sharedstorage.php @@ -583,9 +583,6 @@ class Shared extends \OC\Files\Storage\Common implements ISharedStorage { } public function getETag($path) { - if ($path == '') { - $path = $this->getMountPoint(); - } if ($source = $this->getSourcePath($path)) { list($storage, $internalPath) = \OC\Files\Filesystem::resolvePath($source); return $storage->getETag($internalPath); diff --git a/apps/files_sharing/tests/etagpropagation.php b/apps/files_sharing/tests/etagpropagation.php index 6d23959d66d..f7f8ec35288 100644 --- a/apps/files_sharing/tests/etagpropagation.php +++ b/apps/files_sharing/tests/etagpropagation.php @@ -47,6 +47,7 @@ class EtagPropagation extends TestCase { \OC_Hook::clear('OC_Filesystem', 'post_write'); \OC_Hook::clear('OC_Filesystem', 'post_delete'); \OC_Hook::clear('OC_Filesystem', 'post_rename'); + \OC_Hook::clear('OCP\Share', 'post_update_permissions'); parent::tearDown(); } @@ -406,4 +407,17 @@ class EtagPropagation extends TestCase { $this->assertAllUnchaged(); } + + public function testEtagChangeOnPermissionsChange() { + $this->loginAsUser(self::TEST_FILES_SHARING_API_USER1); + + $view = new View('/' . self::TEST_FILES_SHARING_API_USER1 . '/files'); + $folderInfo = $view->getFileInfo('/sub1/sub2/folder'); + + \OCP\Share::setPermissions('folder', $folderInfo->getId(), \OCP\Share::SHARE_TYPE_USER, self::TEST_FILES_SHARING_API_USER2, 17); + + $this->assertEtagsForFoldersChanged([self::TEST_FILES_SHARING_API_USER2, self::TEST_FILES_SHARING_API_USER4]); + + $this->assertAllUnchaged(); + } } diff --git a/apps/files_sharing/tests/external/managertest.php b/apps/files_sharing/tests/external/managertest.php index 8e03c67a9a3..7242779d455 100644 --- a/apps/files_sharing/tests/external/managertest.php +++ b/apps/files_sharing/tests/external/managertest.php @@ -23,9 +23,12 @@ namespace OCA\Files_Sharing\Tests\External; use OC\Files\Storage\StorageFactory; use OCA\Files_Sharing\External\Manager; +use OCA\Files_Sharing\External\MountProvider; use OCA\Files_Sharing\Tests\TestCase; +use Test\Traits\UserTrait; class ManagerTest extends TestCase { + use UserTrait; /** @var Manager **/ private $manager; @@ -38,10 +41,18 @@ class ManagerTest extends TestCase { private $uid; + /** + * @var \OCP\IUser + */ + private $user; + private $mountProvider; + protected function setUp() { parent::setUp(); $this->uid = $this->getUniqueID('user'); + $this->createUser($this->uid, ''); + $this->user = \OC::$server->getUserManager()->get($this->uid); $this->mountManager = new \OC\Files\Mount\Manager(); $this->httpHelper = $httpHelper = $this->getMockBuilder('\OC\HTTPHelper')->disableOriginalConstructor()->getMock(); /** @var \OC\HTTPHelper $httpHelper */ @@ -53,6 +64,16 @@ class ManagerTest extends TestCase { \OC::$server->getNotificationManager(), $this->uid ); + $this->mountProvider = new MountProvider(\OC::$server->getDatabaseConnection(), function() { + return $this->manager; + }); + } + + private function setupMounts() { + $mounts = $this->mountProvider->getMountsForUser($this->user, new StorageFactory()); + foreach ($mounts as $mount) { + $this->mountManager->addMount($mount); + } } public function testAddShare() { @@ -77,7 +98,7 @@ class ManagerTest extends TestCase { $this->assertCount(1, $openShares); $this->assertExternalShareEntry($shareData1, $openShares[0], 1, '{{TemporaryMountPointName#' . $shareData1['name'] . '}}'); - self::invokePrivate($this->manager, 'setupMounts'); + $this->setupMounts(); $this->assertNotMount('SharedFolder'); $this->assertNotMount('{{TemporaryMountPointName#' . $shareData1['name'] . '}}'); @@ -89,7 +110,7 @@ class ManagerTest extends TestCase { // New share falls back to "-1" appendix, because the name is already taken $this->assertExternalShareEntry($shareData2, $openShares[1], 2, '{{TemporaryMountPointName#' . $shareData2['name'] . '}}-1'); - self::invokePrivate($this->manager, 'setupMounts'); + $this->setupMounts(); $this->assertNotMount('SharedFolder'); $this->assertNotMount('{{TemporaryMountPointName#' . $shareData1['name'] . '}}'); $this->assertNotMount('{{TemporaryMountPointName#' . $shareData1['name'] . '}}-1'); @@ -111,7 +132,7 @@ class ManagerTest extends TestCase { $this->assertCount(1, $openShares); $this->assertExternalShareEntry($shareData2, $openShares[0], 2, '{{TemporaryMountPointName#' . $shareData2['name'] . '}}-1'); - self::invokePrivate($this->manager, 'setupMounts'); + $this->setupMounts(); $this->assertMount($shareData1['name']); $this->assertNotMount('{{TemporaryMountPointName#' . $shareData1['name'] . '}}'); $this->assertNotMount('{{TemporaryMountPointName#' . $shareData1['name'] . '}}-1'); @@ -124,7 +145,7 @@ class ManagerTest extends TestCase { // New share falls back to the original name (no "-\d", because the name is not taken) $this->assertExternalShareEntry($shareData3, $openShares[1], 3, '{{TemporaryMountPointName#' . $shareData3['name'] . '}}'); - self::invokePrivate($this->manager, 'setupMounts'); + $this->setupMounts(); $this->assertMount($shareData1['name']); $this->assertNotMount('{{TemporaryMountPointName#' . $shareData1['name'] . '}}'); $this->assertNotMount('{{TemporaryMountPointName#' . $shareData1['name'] . '}}-1'); @@ -136,7 +157,7 @@ class ManagerTest extends TestCase { // Decline the third share $this->manager->declineShare($openShares[1]['id']); - self::invokePrivate($this->manager, 'setupMounts'); + $this->setupMounts(); $this->assertMount($shareData1['name']); $this->assertNotMount('{{TemporaryMountPointName#' . $shareData1['name'] . '}}'); $this->assertNotMount('{{TemporaryMountPointName#' . $shareData1['name'] . '}}-1'); @@ -151,7 +172,7 @@ class ManagerTest extends TestCase { $this->assertCount(1, $openShares); $this->assertExternalShareEntry($shareData2, $openShares[0], 2, '{{TemporaryMountPointName#' . $shareData2['name'] . '}}-1'); - self::invokePrivate($this->manager, 'setupMounts'); + $this->setupMounts(); $this->assertMount($shareData1['name']); $this->assertNotMount('{{TemporaryMountPointName#' . $shareData1['name'] . '}}'); $this->assertNotMount('{{TemporaryMountPointName#' . $shareData1['name'] . '}}-1'); |