summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'kde-apps/kio-extras/files/kio-extras-17.04.3-smb.patch')
-rw-r--r--kde-apps/kio-extras/files/kio-extras-17.04.3-smb.patch240
1 files changed, 240 insertions, 0 deletions
diff --git a/kde-apps/kio-extras/files/kio-extras-17.04.3-smb.patch b/kde-apps/kio-extras/files/kio-extras-17.04.3-smb.patch
new file mode 100644
index 000000000000..b6b83845f795
--- /dev/null
+++ b/kde-apps/kio-extras/files/kio-extras-17.04.3-smb.patch
@@ -0,0 +1,240 @@
+From 2574c9158febdcb3dd7a0ebc3e76311f016d00d0 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Michal=20Mal=C3=BD?= <malymi@natur.cuni.cz>
+Date: Wed, 12 Jul 2017 11:55:04 +0200
+Subject: Always create the "." UDSEntry
+
+Summary:
+The smb_kio plugin does not create the "." UDSEntry,
+relying on the underlying KIO infrastructure to create a default one.
+
+This patch ensures that the UDSEntry is always created with proper access permissions.
+
+CCBUG: 376344
+
+Reviewers: elvisangelaccio
+
+Differential Revision: https://phabricator.kde.org/D6616
+---
+ smb/kio_smb_browse.cpp | 23 ++++++++++++++++++++++-
+ 1 file changed, 22 insertions(+), 1 deletion(-)
+
+diff --git a/smb/kio_smb_browse.cpp b/smb/kio_smb_browse.cpp
+index 1ca90a2..06ca60b 100644
+--- a/smb/kio_smb_browse.cpp
++++ b/smb/kio_smb_browse.cpp
+@@ -309,6 +309,7 @@ void SMBSlave::listDir( const QUrl& kurl )
+ int dirfd;
+ struct smbc_dirent *dirp = NULL;
+ UDSEntry udsentry;
++ bool dir_is_root = true;
+
+ dirfd = smbc_opendir( m_current_url.toSmbcUrl() );
+ if (dirfd > 0){
+@@ -350,8 +351,14 @@ void SMBSlave::listDir( const QUrl& kurl )
+ udsentry.insert(KIO::UDSEntry::UDS_HIDDEN, 1);
+ }
+
+- if (udsName == "." || udsName == "..")
++ if (udsName == ".")
+ {
++ // Skip the "." entry
++ // Mind the way m_current_url is handled in the loop
++ }
++ else if (udsName == "..")
++ {
++ dir_is_root = false;
+ // fprintf(stderr,"----------- hide: -%s-\n",dirp->name);
+ // do nothing and hide the hidden shares
+ }
+@@ -430,6 +437,20 @@ void SMBSlave::listDir( const QUrl& kurl )
+ udsentry.clear();
+ } while (dirp); // checked already in the head
+
++ if (dir_is_root) {
++ udsentry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR);
++ udsentry.insert(KIO::UDSEntry::UDS_NAME, ".");
++ udsentry.insert(KIO::UDSEntry::UDS_ACCESS, (S_IRUSR | S_IRGRP | S_IROTH | S_IXUSR | S_IXGRP | S_IXOTH));
++ udsentry.insert(KIO::UDSEntry::UDS_MIME_TYPE, QLatin1String("application/x-smb-server"));
++ }
++ else
++ {
++ udsentry.insert(KIO::UDSEntry::UDS_NAME, ".");
++ browse_stat_path(m_current_url, udsentry, true);
++ }
++ listEntry(udsentry);
++ udsentry.clear();
++
+ // clean up
+ smbc_closedir(dirfd);
+ }
+--
+cgit v0.11.2
+From e792aa44b5aa0b122e006234a8f87a16ff12fe6f Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Michal=20Mal=C3=BD?= <malymi@natur.cuni.cz>
+Date: Wed, 12 Jul 2017 11:57:12 +0200
+Subject: Return appropriate error code from browse_stat_path() instead of
+ trying to deal with the error internally.
+
+Summary:
+Current behavior of browse_stat_path() can result in both finished() and error() being signaled to KIO.
+This patch adjusts the logic to prevent this case.
+
+Reviewers: elvisangelaccio
+
+BUG: 376344
+FIXED-IN: 17.08.0
+
+Differential Revision: https://phabricator.kde.org/D6617
+---
+ smb/kio_smb.h | 5 ++--
+ smb/kio_smb_browse.cpp | 67 ++++++++++++++++++++++++++++----------------------
+ 2 files changed, 40 insertions(+), 32 deletions(-)
+
+diff --git a/smb/kio_smb.h b/smb/kio_smb.h
+index a5cae11..a2a9343 100644
+--- a/smb/kio_smb.h
++++ b/smb/kio_smb.h
+@@ -156,10 +156,9 @@ protected:
+ * Description : Return a stat of given SMBUrl. Calls cache_stat and
+ * pack it in UDSEntry. UDSEntry will not be cleared
+ * Parameter : SMBUrl the url to stat
+- * ignore_errors do not call error(), but warning()
+- * Return : false if any error occurred (errno), else true
++ * Return : cache_stat() return code
+ */
+- bool browse_stat_path(const SMBUrl& url, UDSEntry& udsentry, bool ignore_errors);
++ int browse_stat_path(const SMBUrl& url, UDSEntry& udsentry);
+
+ /**
+ * Description : call smbc_stat and return stats of the url
+diff --git a/smb/kio_smb_browse.cpp b/smb/kio_smb_browse.cpp
+index 06ca60b..84bfdc2 100644
+--- a/smb/kio_smb_browse.cpp
++++ b/smb/kio_smb_browse.cpp
+@@ -55,8 +55,7 @@ int SMBSlave::cache_stat(const SMBUrl &url, struct stat* st )
+ }
+
+ //---------------------------------------------------------------------------
+-bool SMBSlave::browse_stat_path(const SMBUrl& _url, UDSEntry& udsentry, bool ignore_errors)
+- // Returns: true on success, false on failure
++int SMBSlave::browse_stat_path(const SMBUrl& _url, UDSEntry& udsentry)
+ {
+ SMBUrl url = _url;
+
+@@ -68,7 +67,7 @@ bool SMBSlave::browse_stat_path(const SMBUrl& _url, UDSEntry& udsentry, bool ign
+ qCDebug(KIO_SMB) << "mode: "<< st.st_mode;
+ warning(i18n("%1:\n"
+ "Unknown file type, neither directory or file.", url.toDisplayString()));
+- return false;
++ return EINVAL;
+ }
+
+ udsentry.insert(KIO::UDSEntry::UDS_FILE_TYPE, st.st_mode & S_IFMT);
+@@ -96,24 +95,8 @@ bool SMBSlave::browse_stat_path(const SMBUrl& _url, UDSEntry& udsentry, bool ign
+ udsentry.insert(KIO::UDSEntry::UDS_ACCESS_TIME, st.st_atime);
+ // No, st_ctime is not UDS_CREATION_TIME...
+ }
+- else
+- {
+- if (!ignore_errors) {
+- if (cacheStatErr == EPERM || cacheStatErr == EACCES)
+- if (checkPassword(url)) {
+- redirection( url );
+- return false;
+- }
+-
+- reportError(url, cacheStatErr);
+- } else if (cacheStatErr == ENOENT || cacheStatErr == ENOTDIR) {
+- warning(i18n("File does not exist: %1", url.url()));
+- }
+- qCDebug(KIO_SMB) << "ERROR!!";
+- return false;
+- }
+
+- return true;
++ return cacheStatErr;
+ }
+
+ //===========================================================================
+@@ -141,7 +124,7 @@ void SMBSlave::stat( const QUrl& kurl )
+ switch(m_current_url.getType())
+ {
+ case SMBURLTYPE_UNKNOWN:
+- error(ERR_MALFORMED_URL,m_current_url.toDisplayString());
++ error(ERR_MALFORMED_URL, url.toDisplayString());
+ return;
+
+ case SMBURLTYPE_ENTIRE_NETWORK:
+@@ -150,12 +133,38 @@ void SMBSlave::stat( const QUrl& kurl )
+ break;
+
+ case SMBURLTYPE_SHARE_OR_PATH:
+- if (browse_stat_path(m_current_url, udsentry, false))
++ {
++ int ret = browse_stat_path(m_current_url, udsentry);
++
++ if (ret == EPERM || ret == EACCES)
++ {
++ SMBUrl smbUrl(url);
++
++ if (checkPassword(smbUrl))
++ {
++ redirection(smbUrl);
++ finished();
++ }
++ else
++ {
++ reportError(url, ret);
++ }
++
++ return;
++ }
++ else if (ret == ENOENT || ret == ENOTDIR)
++ {
++ warning(i18n("File does not exist: %1", url.url()));
++ finished();
++ return;
++ }
++ else if (ret != 0)
++ {
++ qCDebug(KIO_SMB) << "stat() error" << ret << url;
++ reportError(url, ret);
++ return;
++ }
+ break;
+- else {
+- qCDebug(KIO_SMB) << "ERROR!!";
+- finished();
+- return;
+ }
+ default:
+ qCDebug(KIO_SMB) << "UNKNOWN " << url;
+@@ -366,7 +375,7 @@ void SMBSlave::listDir( const QUrl& kurl )
+ {
+ // Set stat information
+ m_current_url.addPath(dirpName);
+- browse_stat_path(m_current_url, udsentry, true);
++ browse_stat_path(m_current_url, udsentry);
+ m_current_url.cd("..");
+
+ // Call base class to list entry
+@@ -375,7 +384,7 @@ void SMBSlave::listDir( const QUrl& kurl )
+ else if(dirp->smbc_type == SMBC_DIR)
+ {
+ m_current_url.addPath(dirpName);
+- browse_stat_path(m_current_url, udsentry, true);
++ browse_stat_path(m_current_url, udsentry);
+ m_current_url.cd("..");
+
+ // Call base class to list entry
+@@ -446,7 +455,7 @@ void SMBSlave::listDir( const QUrl& kurl )
+ else
+ {
+ udsentry.insert(KIO::UDSEntry::UDS_NAME, ".");
+- browse_stat_path(m_current_url, udsentry, true);
++ browse_stat_path(m_current_url, udsentry);
+ }
+ listEntry(udsentry);
+ udsentry.clear();
+--
+cgit v0.11.2