Commit b6c1523b806d4885f5b723b1054c1371ebe0c220

Authored by Megan Watson
1 parent 94368c95

BBS-298

"Mac OS X Webdav as 3rd Party Client"
Updated. Added functionality to prevent the .DS_Store files and ._filename files from being uploaded when adding a document or folder. Added Goliath as a client. Removed the forward slash from the end of file names.

Committed by: Megan Watson
Reviewed by: Conrad Vermeulen



git-svn-id: https://kt-dms.svn.sourceforge.net/svnroot/kt-dms/trunk@7450 c91229c3-7414-0410-bfa2-8a42b809f60b
ktwebdav/lib/KTWebDAVServer.inc.php
@@ -167,7 +167,7 @@ class KTWebDAVServer extends HTTP_WebDAV_Server @@ -167,7 +167,7 @@ class KTWebDAVServer extends HTTP_WebDAV_Server
167 167
168 // Load KTWebDAV config 168 // Load KTWebDAV config
169 if (!$this->initConfig()) { 169 if (!$this->initConfig()) {
170 - $this->ktwebdavLog('Could not load configiration.', 'error'); 170 + $this->ktwebdavLog('Could not load configuration.', 'error');
171 exit(0); 171 exit(0);
172 } 172 }
173 173
@@ -437,6 +437,22 @@ class KTWebDAVServer extends HTTP_WebDAV_Server @@ -437,6 +437,22 @@ class KTWebDAVServer extends HTTP_WebDAV_Server
437 437
438 $path = $options["path"]; 438 $path = $options["path"];
439 439
  440 + // Fix for Mac Clients
  441 + // Mac adds DS_Store files when folders are added and ._filename files when files are added
  442 + // The PUT function doesn't add these files to the dms but PROPFIND still looks for the .DS_Store file,
  443 + // and returns an error if not found. We emulate its existence by returning a positive result.
  444 + if($this->dav_client == 'MC' || $this->dav_client == 'MG'){
  445 + // Remove filename from path
  446 + $aPath = explode('/', $path);
  447 + $fileName = $aPath[count($aPath)-1];
  448 +
  449 + if(strtolower($fileName) == '.ds_store'){
  450 + $this->ktwebdavLog("Using a Mac client. Filename is .DS_Store so we emulate a positive result.", 'info', true);
  451 + // ignore
  452 + return true;
  453 + }
  454 + }
  455 +
440 list($iFolderID, $iDocumentID) = $this->_folderOrDocument($path); 456 list($iFolderID, $iDocumentID) = $this->_folderOrDocument($path);
441 $this->ktwebdavLog("Folder/Doc is " . print_r(array($iFolderID, $iDocumentID), true), 'info', true); 457 $this->ktwebdavLog("Folder/Doc is " . print_r(array($iFolderID, $iDocumentID), true), 'info', true);
442 458
@@ -664,7 +680,7 @@ class KTWebDAVServer extends HTTP_WebDAV_Server @@ -664,7 +680,7 @@ class KTWebDAVServer extends HTTP_WebDAV_Server
664 } else { 680 } else {
665 $options["depth"] = "infinity"; 681 $options["depth"] = "infinity";
666 } 682 }
667 - 683 +
668 // analyze request payload 684 // analyze request payload
669 $propinfo = new _parse_propfind("php://input"); 685 $propinfo = new _parse_propfind("php://input");
670 if (!$propinfo->success) { 686 if (!$propinfo->success) {
@@ -798,8 +814,22 @@ class KTWebDAVServer extends HTTP_WebDAV_Server @@ -798,8 +814,22 @@ class KTWebDAVServer extends HTTP_WebDAV_Server
798 814
799 echo " <D:response $ns_defs>\n"; 815 echo " <D:response $ns_defs>\n";
800 816
801 - $href = htmlspecialchars($this->_slashify($this->_mergePathes($_SERVER['SCRIPT_NAME'], $path)));  
802 - 817 + $tempHref = $this->_mergePathes($_SERVER['SCRIPT_NAME'], $path);
  818 +
  819 + // Ensure collections end in a slash
  820 + if(isset($file['props'])){
  821 + foreach($file['props'] as $v){
  822 + if($v['name'] == 'resourcetype'){
  823 + if($v['val'] == 'collection'){
  824 + $tempHref = $this->_slashify($tempHref);
  825 + continue;
  826 + }
  827 + }
  828 + }
  829 + }
  830 +
  831 + $href = htmlspecialchars($tempHref);
  832 +
803 echo " <D:href>$href</D:href>\n"; 833 echo " <D:href>$href</D:href>\n";
804 834
805 $this->ktwebdavLog("\nfile is: " . print_r($file, true), 'info', true); 835 $this->ktwebdavLog("\nfile is: " . print_r($file, true), 'info', true);
@@ -1101,7 +1131,7 @@ class KTWebDAVServer extends HTTP_WebDAV_Server @@ -1101,7 +1131,7 @@ class KTWebDAVServer extends HTTP_WebDAV_Server
1101 while (count($aRemaining)) { 1131 while (count($aRemaining)) {
1102 $sFolderName = $aRemaining[0]; 1132 $sFolderName = $aRemaining[0];
1103 $aRemaining = array_slice($aRemaining, 1); 1133 $aRemaining = array_slice($aRemaining, 1);
1104 - if ($sFolderName == '') { 1134 + if (empty($sFolderName)) {
1105 continue; 1135 continue;
1106 } 1136 }
1107 // FIXME: Direct database access 1137 // FIXME: Direct database access
@@ -1187,6 +1217,29 @@ class KTWebDAVServer extends HTTP_WebDAV_Server @@ -1187,6 +1217,29 @@ class KTWebDAVServer extends HTTP_WebDAV_Server
1187 $this->ktwebdavLog("dav_client is: " . $this->dav_client, 'info', true); 1217 $this->ktwebdavLog("dav_client is: " . $this->dav_client, 'info', true);
1188 1218
1189 $path = $options["path"]; 1219 $path = $options["path"];
  1220 +
  1221 + // Fix for Mac
  1222 + // Mac adds DS_Store files when folders are added and ._filename files when files are added
  1223 + // we want to ignore them.
  1224 + if($this->dav_client == 'MC' || $this->dav_client == 'MG'){
  1225 + // Remove filename from path
  1226 + $aPath = explode('/', $path);
  1227 + $fileName = $aPath[count($aPath)-1];
  1228 +
  1229 + if(strtolower($fileName) == '.ds_store'){
  1230 + $this->ktwebdavLog("Using a mac client. Ignore the .DS_Store files created with every folder.", 'info', true);
  1231 + // ignore
  1232 + return "204 No Content";
  1233 + }
  1234 +
  1235 + if($fileName[0] == '.' && $fileName[1] == '_'){
  1236 + $fileName = substr($fileName, 2);
  1237 + $this->ktwebdavLog("Using a mac client. Ignore the ._filename files created with every file.", 'info', true);
  1238 + // ignore
  1239 + return "204 No Content";
  1240 + }
  1241 + }
  1242 +
1190 1243
1191 $res = $this->_folderOrDocument($path); 1244 $res = $this->_folderOrDocument($path);
1192 list($iFolderID, $iDocumentID) = $res; 1245 list($iFolderID, $iDocumentID) = $res;
@@ -1623,6 +1676,18 @@ class KTWebDAVServer extends HTTP_WebDAV_Server @@ -1623,6 +1676,18 @@ class KTWebDAVServer extends HTTP_WebDAV_Server
1623 function _MOVEDocument($options, $iFolderID, $iDocumentID) { 1676 function _MOVEDocument($options, $iFolderID, $iDocumentID) {
1624 1677
1625 if ($options['dest'] == '') $options["dest"] = substr($options["dest_url"], strlen($_SERVER["SCRIPT_NAME"])); 1678 if ($options['dest'] == '') $options["dest"] = substr($options["dest_url"], strlen($_SERVER["SCRIPT_NAME"]));
  1679 +
  1680 + // Fix for Mac
  1681 + if($this->dav_client == 'MG'){
  1682 + $this->ktwebdavLog("Remove ktwebdav from destination path: ".$options['dest'], 'info', true);
  1683 + if(!(strpos($options['dest'], 'ktwebdav/ktwebdav.php/') === FALSE)){
  1684 + $options['dest'] = substr($options['dest'], 22);
  1685 + }
  1686 + if($options['dest'][0] != '/'){
  1687 + $options['dest'] = '/'.$options['dest'];
  1688 + }
  1689 + }
  1690 +
1626 $this->ktwebdavLog("Entering _MOVEDocument. options are " . print_r($options, true), 'info', true); 1691 $this->ktwebdavLog("Entering _MOVEDocument. options are " . print_r($options, true), 'info', true);
1627 global $default; 1692 global $default;
1628 $new = true; 1693 $new = true;
@@ -1643,7 +1708,7 @@ class KTWebDAVServer extends HTTP_WebDAV_Server @@ -1643,7 +1708,7 @@ class KTWebDAVServer extends HTTP_WebDAV_Server
1643 // return "412 Precondition Failed - This is a Rename. Overwrite needs to be TRUE."; 1708 // return "412 Precondition Failed - This is a Rename. Overwrite needs to be TRUE.";
1644 //} 1709 //}
1645 $this->ktwebdavLog("Got an oDocument of " . print_r($oDocument, true), 'info', true); 1710 $this->ktwebdavLog("Got an oDocument of " . print_r($oDocument, true), 'info', true);
1646 - $this->ktwebdavLog("Got an new name of " . basename($dest_path), 'info', true); 1711 + $this->ktwebdavLog("Got a new name of " . basename($dest_path), 'info', true);
1647 1712
1648 // Check if the user has permissions to write this document 1713 // Check if the user has permissions to write this document
1649 $oPerm =& KTPermission::getByName('ktcore.permissions.write'); 1714 $oPerm =& KTPermission::getByName('ktcore.permissions.write');
@@ -2194,10 +2259,15 @@ class KTWebDAVServer extends HTTP_WebDAV_Server @@ -2194,10 +2259,15 @@ class KTWebDAVServer extends HTTP_WebDAV_Server
2194 $this->ktwebdavLog("WebDAV Client : " . $userAgentValue, 'info', true); 2259 $this->ktwebdavLog("WebDAV Client : " . $userAgentValue, 'info', true);
2195 } 2260 }
2196 // Mac Finder 2261 // Mac Finder
2197 - if (stristr($userAgentValue,"Macintosh")) { 2262 + if (stristr($userAgentValue,"Macintosh") || stristr($userAgentValue,"Darwin")) {
2198 $this->dav_client = "MC"; 2263 $this->dav_client = "MC";
2199 $this->ktwebdavLog("WebDAV Client : " . $userAgentValue, 'info', true); 2264 $this->ktwebdavLog("WebDAV Client : " . $userAgentValue, 'info', true);
2200 } 2265 }
  2266 + // Mac Goliath
  2267 + if (stristr($userAgentValue,"Goliath")) {
  2268 + $this->dav_client = "MG";
  2269 + $this->ktwebdavLog("WebDAV Client : " . $userAgentValue, 'info', true);
  2270 + }
2201 // Konqueror 2271 // Konqueror
2202 if (stristr($userAgentValue,"Konqueror")) { 2272 if (stristr($userAgentValue,"Konqueror")) {
2203 $this->dav_client = "KO"; 2273 $this->dav_client = "KO";
@@ -2228,6 +2298,20 @@ class KTWebDAVServer extends HTTP_WebDAV_Server @@ -2228,6 +2298,20 @@ class KTWebDAVServer extends HTTP_WebDAV_Server
2228 return false; 2298 return false;
2229 2299
2230 } 2300 }
  2301 + // Mac Goliath
  2302 + if ($this->dav_client == 'MG' && $this->safeMode == 'off') {
  2303 +
  2304 + $this->ktwebdavLog("This is a Mac Goliath type client with SafeMode off.", 'info', true);
  2305 + return true;
  2306 +
  2307 + }
  2308 + // Mac Goliath
  2309 + if ($this->dav_client == 'MG' && $this->safeMode != 'off') {
  2310 +
  2311 + $this->ktwebdavLog("This is a Mac Goliath type client with SafeMode on.", 'info', true);
  2312 + return false;
  2313 +
  2314 + }
2231 // Konqueror 2315 // Konqueror
2232 if ($this->dav_client == 'KO' && $this->safeMode == 'off') { 2316 if ($this->dav_client == 'KO' && $this->safeMode == 'off') {
2233 2317