Commit 525a5e73350ad3004d3d6aa5d8d67afdfd9d9e2a

Authored by nbm
1 parent 144424a9

Add permission object and lookup attributes. Also clean up things a

bit.


git-svn-id: https://kt-dms.svn.sourceforge.net/svnroot/kt-dms/trunk@3511 c91229c3-7414-0410-bfa2-8a42b809f60b
Showing 1 changed file with 41 additions and 306 deletions
lib/foldermanagement/Folder.inc
@@ -47,10 +47,10 @@ class Folder extends KTEntity { @@ -47,10 +47,10 @@ class Folder extends KTEntity {
47 var $sParentFolderIDs; 47 var $sParentFolderIDs;
48 /** forward slash deliminated path from file system root */ 48 /** forward slash deliminated path from file system root */
49 var $sFullPath; 49 var $sFullPath;
50 - /** whether to inherit parent permissions or not */  
51 - var $bInheritParentPermission;  
52 - /** which folder I get permissions from (eases search lookups) */  
53 - var $iPermissionFolderID; 50 + /** which permission object I get permissions from */
  51 + var $iPermissionObjectID;
  52 + /** lookup accelerator id */
  53 + var $iPermissionLookupID;
54 54
55 /** 55 /**
56 * Folder class constructor 56 * Folder class constructor
@@ -72,162 +72,40 @@ class Folder extends KTEntity { @@ -72,162 +72,40 @@ class Folder extends KTEntity {
72 $this->iCreatorID = $iNewCreatorID; 72 $this->iCreatorID = $iNewCreatorID;
73 $this->iUnitID = $iNewUnitID; 73 $this->iUnitID = $iNewUnitID;
74 $this->bIsPublic = $bNewIsPublic; 74 $this->bIsPublic = $bNewIsPublic;
75 - $this->bInheritParentPermissions = true;  
76 } 75 }
77 76
78 - /**  
79 - * Get the primary key of the current folder object  
80 - *  
81 - * @return integer primary key of folder  
82 - *  
83 - */  
84 - function getID() {  
85 - return $this->iId;  
86 - }  
87 -  
88 - /**  
89 - * Get the folder name  
90 - *  
91 - * @return String folder name  
92 - */  
93 - function getName() {  
94 - return $this->sName;  
95 - }  
96 -  
97 - /**  
98 - * Set the folder name  
99 - *  
100 - * @param $sNewValue New folder name  
101 - */  
102 - function setName($sNewValue) {  
103 - $this->sName = $sNewValue;  
104 - }  
105 -  
106 - /**  
107 - * Get the folder description  
108 - *  
109 - * @return String folder description  
110 - */  
111 - function getDescription() {  
112 - return $this->sDescription;  
113 - }  
114 -  
115 - /**  
116 - * Set the folder description  
117 - *  
118 - * @param $sNewValue New folder description  
119 - *  
120 - */  
121 - function setDescription($sNewValue) {  
122 - $this->sDescription = $sNewValue;  
123 - }  
124 -  
125 - /**  
126 - * Get the parent folder primary key  
127 - *  
128 - * @return integer parent folder primary key  
129 - *  
130 - */  
131 - function getParentID() {  
132 - return $this->iParentID;  
133 - }  
134 -  
135 - /**  
136 - * Set the parent folder primary key  
137 - *  
138 - * @param $iNewValue New parent folder primary key  
139 - *  
140 - */  
141 - function setParentID($iNewValue) {  
142 - $this->iParentID = $iNewValue;  
143 - }  
144 -  
145 - /**  
146 - * Get the creator user id  
147 - *  
148 - * @return integer creator user id  
149 - *  
150 - */  
151 - function getCreatorID() {  
152 - return $this->iCreatorID;  
153 - }  
154 -  
155 - /**  
156 - * Set the creator user id  
157 - *  
158 - * @param $iNewValue New creator user id  
159 - *  
160 - */  
161 - function setCreatorID($iNewValue) {  
162 - $this->iCreatorID = $iNewValue;  
163 - }  
164 -  
165 - /**  
166 - * Get the unit primary key  
167 - *  
168 - * @return integer primary key of unit to which the folder belongs  
169 - *  
170 - */  
171 - function getUnitID() {  
172 - return $this->iUnitID;  
173 - }  
174 -  
175 - /**  
176 - * Set the unit prinary key  
177 - *  
178 - * @param $iNewValue New primary key of unit to which folder belongs  
179 - *  
180 - */  
181 - function setUnitID($iNewValue) {  
182 - $this->iUnitID = $iNewValue;  
183 - }  
184 -  
185 - /**  
186 - * Get the folder public status  
187 - *  
188 - * @return boolean true if folder is public, false if folder is not  
189 - *  
190 - */  
191 - function getIsPublic() {  
192 - return $this->bIsPublic;  
193 - }  
194 -  
195 - /**  
196 - * Set the folder public status  
197 - *  
198 - * @param $bNewValue New folder public status  
199 - *  
200 - */  
201 - function setIsPublic($bNewValue) {  
202 - $this->bIsPublic = $bNewValue;  
203 - }  
204 -  
205 - function getFullPath() {  
206 - return $this->sFullPath;  
207 - }  
208 -  
209 - function getParentFolderIDs() {  
210 - return $this->sParentFolderIDs;  
211 - }  
212 -  
213 - function getInheritParentPermission() {  
214 - return $this->bInheritParentPermissions;  
215 - }  
216 -  
217 - function setInheritParentPermission($bNewValue) {  
218 - $this->bInheritParentPermissions = $bNewValue;  
219 - } 77 + function getID() { return $this->iId; }
  78 + function getName() { return $this->sName; }
  79 + function setName($sNewValue) { $this->sName = $sNewValue; }
  80 + function getDescription() { return $this->sDescription; }
  81 + function setDescription($sNewValue) { $this->sDescription = $sNewValue; }
  82 + function getParentID() { return $this->iParentID; }
  83 + function setParentID($iNewValue) { $this->iParentID = $iNewValue; }
  84 + function getCreatorID() { return $this->iCreatorID; }
  85 + function setCreatorID($iNewValue) { $this->iCreatorID = $iNewValue; }
  86 + function getUnitID() { return $this->iUnitID; }
  87 + function setUnitID($iNewValue) { $this->iUnitID = $iNewValue; }
  88 + function getIsPublic() { return $this->bIsPublic; }
  89 + function setIsPublic($bNewValue) { $this->bIsPublic = $bNewValue; }
  90 + function getFullPath() { return $this->sFullPath; }
  91 + function getParentFolderIDs() { return $this->sParentFolderIDs; }
220 92
221 - /**  
222 - * Get the permission folder id  
223 - *  
224 - * @return integer permission folder id  
225 - *  
226 - */  
227 - function getPermissionFolderID() {  
228 - return $this->iPermissionFolderID;  
229 - }  
230 - 93 + function getPermissionObjectID() { return $this->iPermissionObjectID; }
  94 + function setPermissionObjectID($iPermissionObjectID) { $this->iPermissionObjectID = $iPermissionObjectID; }
  95 + function getPermissionLookupID() { return $this->iPermissionLookupID; }
  96 + function setPermissionLookupID($iPermissionLookupID) { $this->iPermissionLookupID = $iPermissionLookupID; }
  97 +
  98 + // {{{ create()
  99 + function create () {
  100 + $oParentFolder = Folder::get($this->iParentID);
  101 + $this->iPermissionObjectID = $oParentFolder->getPermissionObjectID();
  102 + $res = parent::create();
  103 + if ($res === true) {
  104 + KTPermissionUtil::updatePermissionLookup($this);
  105 + }
  106 + return $res;
  107 + }
  108 + // }}}
231 /** 109 /**
232 * Recursive function to generate a comma delimited string containing 110 * Recursive function to generate a comma delimited string containing
233 * the parent folder ids 111 * the parent folder ids
@@ -241,7 +119,7 @@ class Folder extends KTEntity { @@ -241,7 +119,7 @@ class Folder extends KTEntity {
241 $sql = $default->db; 119 $sql = $default->db;
242 $sql->query(array("SELECT parent_id FROM $default->folders_table WHERE ID = ?", $iFolderID));/*ok*/ 120 $sql->query(array("SELECT parent_id FROM $default->folders_table WHERE ID = ?", $iFolderID));/*ok*/
243 $sql->next_record(); 121 $sql->next_record();
244 - return $this->generateParentFolderIDS($sql->f("parent_id")) . ",$iFolderID"; 122 + return Folder::generateParentFolderIDS($sql->f("parent_id")) . ",$iFolderID";
245 } 123 }
246 return; 124 return;
247 125
@@ -253,7 +131,7 @@ class Folder extends KTEntity { @@ -253,7 +131,7 @@ class Folder extends KTEntity {
253 * @return String comma delimited string containing the parent folder ids 131 * @return String comma delimited string containing the parent folder ids
254 */ 132 */
255 function generateFolderIDs($iFolderID) { 133 function generateFolderIDs($iFolderID) {
256 - $sFolderIDs = $this->generateParentFolderIDS($iFolderID); 134 + $sFolderIDs = Folder::generateParentFolderIDS($iFolderID);
257 return substr($sFolderIDs, 1, strlen($sFolderIDs)); 135 return substr($sFolderIDs, 1, strlen($sFolderIDs));
258 } 136 }
259 137
@@ -296,8 +174,8 @@ class Folder extends KTEntity { @@ -296,8 +174,8 @@ class Folder extends KTEntity {
296 'is_public' => KTUtil::anyToBool($this->bIsPublic), 174 'is_public' => KTUtil::anyToBool($this->bIsPublic),
297 'full_path' => $this->sFullPath, 175 'full_path' => $this->sFullPath,
298 'parent_folder_ids' => $this->sParentFolderIDs, 176 'parent_folder_ids' => $this->sParentFolderIDs,
299 - 'inherit_parent_folder_permission' => $this->bInheritParentPermissions,  
300 - 'permission_folder_id' => $this->iPermissionFolderID, 177 + 'permission_object_id' => $this->iPermissionObjectID,
  178 + 'permission_lookup_id' => $this->iPermissionLookupID,
301 ); 179 );
302 } 180 }
303 181
@@ -418,7 +296,8 @@ class Folder extends KTEntity { @@ -418,7 +296,8 @@ class Folder extends KTEntity {
418 $oFolder->iId = $iFolderID; 296 $oFolder->iId = $iFolderID;
419 $oFolder->sFullPath = $sql->f("full_path"); 297 $oFolder->sFullPath = $sql->f("full_path");
420 $oFolder->sParentFolderIDs = $sql->f("parent_folder_ids"); 298 $oFolder->sParentFolderIDs = $sql->f("parent_folder_ids");
421 - $oFolder->iPermissionFolderID = $sql->f("permission_folder_id"); 299 + $oFolder->iPermissionObjectID = $sql->f("permission_object_id");
  300 + $oFolder->iPermissionLookupID = $sql->f("permission_lookup_id");
422 return $oFolder; 301 return $oFolder;
423 } 302 }
424 $_SESSION["errorMessage"] = $lang_err_object_not_exist . "id = " . $iFolderID . " table = folders"; 303 $_SESSION["errorMessage"] = $lang_err_object_not_exist . "id = " . $iFolderID . " table = folders";
@@ -724,150 +603,6 @@ class Folder extends KTEntity { @@ -724,150 +603,6 @@ class Folder extends KTEntity {
724 return false; 603 return false;
725 } 604 }
726 } 605 }
727 -  
728 - function calculatePermissionFolder() {  
729 - global $default;  
730 - $oInheritedFolder = $this;  
731 - while ($bFoundPermissions !== true) {  
732 - /*ok*/$aCheckQuery = array('SELECT id FROM groups_folders_link WHERE folder_id = ? LIMIT 1', $oInheritedFolder->getID());  
733 - if (count(DBUtil::getResultArrayKey($aCheckQuery, 'id')) == 0) {  
734 - $default->log->debug('No direct permissions on folder ' . $oInheritedFolder->getID());  
735 - $bInherited = true;  
736 - $oInheritedFolder =& Folder::get($oInheritedFolder->getParentID());  
737 - if ($oInheritedFolder === false) {  
738 - break;  
739 - }  
740 - // if our parent knows the permission folder, use that.  
741 - if ($oInheritedFolder->getPermissionFolderID()) {  
742 - $this->iPermissionFolderID = $oInheritedFolder->getPermissionFolderID();  
743 - }  
744 - $default->log->debug('... trying parent: ' . $oInheritedFolder->getID());  
745 - } else {  
746 - $default->log->debug('Found direct permissions on folder ' . $oInheritedFolder->getID());  
747 - $this->iPermissionFolderID = $oInheritedFolder->getID();  
748 - return;  
749 - }  
750 - }  
751 -  
752 - $default->log->error('No permissions whatsoever for folder ' . $this->getID());  
753 - // 0, which can never exist, for non-existent. null for not set yet (database upgrade).  
754 - $this->iPermissionFolderID = 0;  
755 - }  
756 -  
757 - // {{{ copyPermissionsFromFolder()  
758 - function copyPermissionsFromFolder ($oFolder) {  
759 - $sQuery = DBUtil::compactQuery("  
760 - SELECT  
761 - GFL.group_id AS group_id,  
762 - GFL.can_read AS can_read,  
763 - GFL.can_write AS can_write  
764 - FROM  
765 - $default->groups_folders_table AS GFL  
766 - WHERE GFL.folder_id = ?");  
767 - $aParams = array($oFolder->getID());  
768 - $aPermissions = DBUtil::getResultArray(array($sQuery, $aParams));  
769 -  
770 - if (PEAR::isError($aPermissions)) {  
771 - return $aPermissions;  
772 - }  
773 -  
774 - foreach ($aPermissions as $aRow) {  
775 - $aRow['folder_id'] = $this->getID();  
776 - $res = DBUtil::autoInsert($default->groups_folders_table, $aRow);  
777 - if (PEAR::isError($res)) {  
778 - return $res;  
779 - }  
780 - }  
781 -  
782 - $this->updatePermissions();  
783 - }  
784 - // }}}  
785 -  
786 - // {{{ create()  
787 - function create () {  
788 - $this->calculatePermissionFolder();  
789 - return parent::create();  
790 - }  
791 - // }}}  
792 -  
793 - // {{{ updatePermissions()  
794 - function updatePermissions () {  
795 - // Update PermissionFolderIDs on folder and all folders in this  
796 - // branch.  
797 - $this->updatePermissionFolders();  
798 -  
799 - // Now, we need to redo the permissions for all documents that  
800 - // share are in this branch of the tree that are in folders that  
801 - // share our PermissionFolderID.  
802 -  
803 - // First, we update the documents in this folder  
804 - $sQuery = "SELECT D.id AS id FROM documents AS D WHERE D.folder_id = ?";  
805 - $aParams = array($this->getID());  
806 - $aDocumentIDs = DBUtil::getResultArrayKey(array($sQuery, $aParams), 'id');  
807 - // OPT: We could just do the work for the first, and copy it to  
808 - // the others...  
809 - foreach ($aDocumentIDs as $iDocumentID) {  
810 - Permission::updateSearchPermissionsForDocument($iDocumentID);  
811 - }  
812 -  
813 - // Then, we update the documents in our subfolders  
814 - $sFolderIDs = $this->generateFolderIDs($this->getID());  
815 - $sFolderIDs .= '%';  
816 - $sQuery = "SELECT D.id AS id FROM documents AS D INNER JOIN folders AS F on D.folder_id = F.id WHERE F.parent_folder_ids LIKE ?";  
817 - $aParams = array($sFolderIDs);  
818 - $aDocumentIDs = DBUtil::getResultArrayKey(array($sQuery, $aParams), 'id');  
819 -  
820 - // OPT: We could just do the work for the first, and copy it to  
821 - // the others...  
822 - foreach ($aDocumentIDs as $iDocumentID) {  
823 - Permission::updateSearchPermissionsForDocument($iDocumentID);  
824 - }  
825 - }  
826 - // }}}  
827 -  
828 - // {{{ updatePermissionFolders()  
829 - /**  
830 - * Update the PermissionFolderID on this folder and all folders on  
831 - * this branch.  
832 - *  
833 - */  
834 - function updatePermissionFolders() {  
835 - $iOldPermissionFolderID = $this->iPermissionFolderID;  
836 - $this->calculatePermissionFolder();  
837 - $iNewPermissionFolderID = $this->iPermissionFolderID;  
838 -  
839 - // If our permission folder hasn't changed, our children's won't  
840 - // have.  
841 - if ($iOldPermissionFolderID === $iNewPermissionFolderID) {  
842 - return;  
843 - }  
844 -  
845 - // XXX: Non-explicit update... Have to update, or the children  
846 - // wouldn't have access to it for the shortcut...  
847 - $this->update();  
848 - $aChildren = Folder::getList(array('parent_id = ?', $this->getID()));  
849 - foreach ($aChildren as $oChild) {  
850 - $oChild->updatePermissionFolders();  
851 - }  
852 - }  
853 - // }}}  
854 -  
855 - function addPermission ($oGroup, $bCanRead, $bCanWrite) {  
856 - $oGroupFolderLink = & new GroupFolderLink($this->getID(), $oGroup->getID(), $bCanRead, $bCanWrite);  
857 -  
858 - if ($oGroupFolderLink->exists()) {  
859 - return new PEAR_Error(_("A folder access entry for the selected folder and group already exists."));  
860 - }  
861 -  
862 - if (!$oGroupFolderLink->create()) {  
863 - //otherwise display an error message  
864 - return new PEAR_Error(_("A folder access entry for the selected folder and group already exists."));  
865 - }  
866 -  
867 - $this->updatePermissions();  
868 - return true;  
869 - }  
870 -  
871 } 606 }
872 607
873 ?> 608 ?>