Merge pull request #21 in KWA/mobile-device-management from bugfix/KMP-60-unable-to-share-a-folder to master
* commit '61a2fe9816fdff1f5f6255a76138b7b3a5fef392': Unable to share a folder
This commit is contained in:
		| @@ -492,7 +492,12 @@ class PluginMDMModule extends Module | |||||||
| 						// We've handled the event | 						// We've handled the event | ||||||
| 						$e->setHandled(); | 						$e->setHandled(); | ||||||
| 					} | 					} | ||||||
|  |  | ||||||
|  | 					if ($storeType != ZARAFA_STORE_PUBLIC_GUID) { | ||||||
| 						$this->getSubFolders($subtreeFolder, $store, $properties, $storeData, $storeUserName); | 						$this->getSubFolders($subtreeFolder, $store, $properties, $storeData, $storeUserName); | ||||||
|  | 					} else { | ||||||
|  | 						$this->getSubFoldersPublic($subtreeFolder, $store, $properties, $storeData, $storeUserName); | ||||||
|  | 					} | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| @@ -696,6 +701,118 @@ class PluginMDMModule extends Module | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	/** | ||||||
|  | 	 * Helper function to get the subfolders of a Public Store | ||||||
|  | 	 * | ||||||
|  | 	 * @access private | ||||||
|  | 	 * @param object $folder Mapi Folder Object. | ||||||
|  | 	 * @param object $store Message Store Object | ||||||
|  | 	 * @param array $properties MAPI property mappings for folders | ||||||
|  | 	 * @param array $storeData Reference to an array. The folder properties are added to this array. | ||||||
|  | 	 * @param string $storeUserName owner name of store. | ||||||
|  | 	 */ | ||||||
|  | 	function getSubFoldersPublic($folder, $store, $properties, &$storeData, $storeUserName) | ||||||
|  | 	{ | ||||||
|  | 		$expand = Array( | ||||||
|  | 			Array( | ||||||
|  | 				'folder' => $folder, | ||||||
|  | 				'props' => mapi_getprops($folder, Array(PR_ENTRYID, PR_SUBFOLDERS)) | ||||||
|  | 			) | ||||||
|  | 		); | ||||||
|  |  | ||||||
|  | 		/** | ||||||
|  | 		 * remove hidden folders, folders with PR_ATTR_HIDDEN property set | ||||||
|  | 		 * should not be shown to the client | ||||||
|  | 		 */ | ||||||
|  | 		$restriction =	Array(RES_OR, Array( | ||||||
|  | 			Array(RES_PROPERTY, | ||||||
|  | 				Array( | ||||||
|  | 					RELOP => RELOP_EQ, | ||||||
|  | 					ULPROPTAG => PR_ATTR_HIDDEN, | ||||||
|  | 					VALUE => Array( PR_ATTR_HIDDEN => false ) | ||||||
|  | 				) | ||||||
|  | 			), | ||||||
|  | 			Array(RES_NOT, | ||||||
|  | 				Array( | ||||||
|  | 					Array(RES_EXIST, | ||||||
|  | 						Array( | ||||||
|  | 							ULPROPTAG => PR_ATTR_HIDDEN | ||||||
|  | 						) | ||||||
|  | 					) | ||||||
|  | 				) | ||||||
|  | 			) | ||||||
|  | 		)); | ||||||
|  |  | ||||||
|  | 		// CONVENIENT_DEPTH doesn't work on the IPM_SUBTREE, hence we will be recursivly | ||||||
|  | 		// walking through the hierarchy. However, we have some special folders like the | ||||||
|  | 		// "Favorites" and "Public Folders" from where we can switch to using | ||||||
|  | 		// CONVENIENT_DEPTH. Obtain these special cases here. | ||||||
|  | 		$specialEntryids = mapi_getprops($store, array( | ||||||
|  | 			PR_IPM_FAVORITES_ENTRYID, | ||||||
|  | 			PR_IPM_PUBLIC_FOLDERS_ENTRYID | ||||||
|  | 		)); | ||||||
|  |  | ||||||
|  | 		// Start looping through the $expand array, during each loop we grab the first item in | ||||||
|  | 		// the array and obtain the hierarchy table for that particular folder. If one of those | ||||||
|  | 		// subfolders has subfolders of its own, it will be appended to $expand again to ensure | ||||||
|  | 		// it will be expanded later. | ||||||
|  | 		while (!empty($expand)) { | ||||||
|  | 			$item = array_shift($expand); | ||||||
|  | 			$columns = $properties; | ||||||
|  | 			$hierarchyTable = mapi_folder_gethierarchytable($item['folder'], MAPI_DEFERRED_ERRORS); | ||||||
|  |  | ||||||
|  | 			mapi_table_restrict($hierarchyTable, $restriction, TBL_BATCH); | ||||||
|  |  | ||||||
|  | 			mapi_table_setcolumns($hierarchyTable, $columns); | ||||||
|  | 			$columns = null; | ||||||
|  |  | ||||||
|  | 			// Load the hierarchy in small batches | ||||||
|  | 			$batchcount = 100; | ||||||
|  | 			do { | ||||||
|  | 				$rows = mapi_table_queryrows($hierarchyTable, $columns, 0, $batchcount); | ||||||
|  |  | ||||||
|  | 				foreach($rows as $subfolder) { | ||||||
|  | 					$specialFolder = false; | ||||||
|  |  | ||||||
|  | 					// Check if this folder is special... | ||||||
|  | 					if (!empty($specialEntryids)) { | ||||||
|  | 						foreach ($specialEntryids as $key => $value) { | ||||||
|  | 							// No need to do compareEntryId(), the special folders have static | ||||||
|  | 							// entryids, and can be compared using ===. | ||||||
|  | 							if (bin2hex($subfolder[PR_ENTRYID]) === bin2hex($value)) { | ||||||
|  | 								$specialFolder = mapi_msgstore_openentry($store, $subfolder[PR_ENTRYID]); | ||||||
|  | 								$subfolder = mapi_getprops($specialFolder, $properties); | ||||||
|  |  | ||||||
|  | 								// We found the folder, no need to loop over it next time. | ||||||
|  | 								unset($specialEntryids[$key]); | ||||||
|  | 								break; | ||||||
|  | 							} | ||||||
|  | 						} | ||||||
|  | 					} | ||||||
|  |  | ||||||
|  | 					// If the subfolders has subfolders of its own, append the folder | ||||||
|  | 					// to the $expand array, so it can be expanded in the next loop. | ||||||
|  | 					if ($subfolder[PR_SUBFOLDERS]) { | ||||||
|  | 						if ($specialFolder) { | ||||||
|  | 							// Special folders can be redirected again to getSubFolders(), | ||||||
|  | 							$this->getSubFolders($specialFolder, $store, $properties, $storeData, $subfolder[PR_ENTRYID], $storeUserName); | ||||||
|  | 						} else { | ||||||
|  | 							$folderObject = mapi_msgstore_openentry($store, $subfolder[PR_ENTRYID]); | ||||||
|  | 							array_push($expand, array('folder' => $folderObject, 'props' => $subfolder)); | ||||||
|  | 						} | ||||||
|  | 					} | ||||||
|  |  | ||||||
|  | 					$subfolder["user"] = $storeUserName; | ||||||
|  | 					// Add the folder to the return list. | ||||||
|  | 					array_push($storeData, $subfolder); | ||||||
|  | 				} | ||||||
|  |  | ||||||
|  | 				// When the server returned a different number of rows then was requested, | ||||||
|  | 				// we have reached the end of the table and we should exit the loop. | ||||||
|  | 			} while (count($rows) === $batchcount); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
| 	 * Function which is use get folder types from the container class | 	 * Function which is use get folder types from the container class | ||||||
|      * @param string $containerClass container class of folder |      * @param string $containerClass container class of folder | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user