Piotr Labudda 9 лет назад
Родитель
Сommit
e1f28fa003

+ 37 - 38
SE/se-lib/Api/WfsDataServer.php

@@ -234,9 +234,26 @@ class Api_WfsDataServer extends Api_WfsServerBase {
 					foreach ($fldList as $idZasob => $fldName) {
 						if($DBG_DS){echo ">>> loop({$itemKey}) item({$item['ID']}) fld({$fldName}): ";var_dump($item[$fldName]);echo"\n";}
 						$fldType = $acl->getXsdFieldType($fldName);
-						$canReadRecord = $acl->canReadObjectField($fldName, (object)$item);
-						if ($canReadRecord) {
-							if ($geomFld != null && $fldName == $geomFld) {
+						if (!$acl->canReadObjectField($fldName, (object)$item)) continue;
+
+						if ($geomFld != null && $fldName == $geomFld) {
+							$xmlWriter->startElement("{$wfsNs}:{$fldName}");
+								if (!$simple && !$acl->canReadObjectField($fldName, (object)$item)) {
+									$xmlWriter->writeAttribute("{$rootWfsNs}:allow_read", "false");
+								}
+								if (!$simple && !$acl->canWriteObjectField($fldName, (object)$item)) {
+									$xmlWriter->writeAttribute("{$rootWfsNs}:allow_write", "true");
+								}
+								$this->_typeConverter->createGmlFromWkt_xmlWriter($item[$fldName], $xmlWriter);
+							$xmlWriter->endElement();// {$wfsNs}:{$fldName}
+						} else if (is_array($item[$fldName])) {// TODO: by struct - REF field
+							if($DBG_DS){echo">>> TODO({$fldName}) REF item[{$itemKey}][{$fldName}]: ";print_r($item[$fldName]);echo "\n";}
+							if (1 == count($item[$fldName])) {
+								$xlink = $item[$fldName][0]['xlink'];
+								$xlinkParts = explode(':', $xlink);
+								if (2 != count($xlinkParts)) throw new Exception("Error Processing Reques - wrong xlink format for ".$acl->getName().".{$itemKey}/{$fldName}");
+								$xlinkParts[0] = Api_WfsNs::getNsUri($xlinkParts[0]);
+								$xlink = implode('#', $xlinkParts);
 								$xmlWriter->startElement("{$wfsNs}:{$fldName}");
 									if (!$simple && !$acl->canReadObjectField($fldName, (object)$item)) {
 										$xmlWriter->writeAttribute("{$rootWfsNs}:allow_read", "false");
@@ -244,43 +261,25 @@ class Api_WfsDataServer extends Api_WfsServerBase {
 									if (!$simple && !$acl->canWriteObjectField($fldName, (object)$item)) {
 										$xmlWriter->writeAttribute("{$rootWfsNs}:allow_write", "true");
 									}
-									$this->_typeConverter->createGmlFromWkt_xmlWriter($item[$fldName], $xmlWriter);
+									$xmlWriter->writeAttribute('xlink:href', $xlink);
 								$xmlWriter->endElement();// {$wfsNs}:{$fldName}
-							} else if (is_array($item[$fldName])) {// TODO: by struct - REF field
-								if($DBG_DS){echo">>> TODO({$fldName}) REF item[{$itemKey}][{$fldName}]: ";print_r($item[$fldName]);echo "\n";}
-								if (1 == count($item[$fldName])) {
-									$xlink = $item[$fldName][0]['xlink'];
-									$xlinkParts = explode(':', $xlink);
-									if (2 != count($xlinkParts)) throw new Exception("Error Processing Reques - wrong xlink format for ".$acl->getName().".{$itemKey}/{$fldName}");
-									$xlinkParts[0] = Api_WfsNs::getNsUri($xlinkParts[0]);
-									$xlink = implode('#', $xlinkParts);
-									$xmlWriter->startElement("{$wfsNs}:{$fldName}");
-										if (!$simple && !$acl->canReadObjectField($fldName, (object)$item)) {
-											$xmlWriter->writeAttribute("{$rootWfsNs}:allow_read", "false");
-										}
-										if (!$simple && !$acl->canWriteObjectField($fldName, (object)$item)) {
-											$xmlWriter->writeAttribute("{$rootWfsNs}:allow_write", "true");
-										}
-										$xmlWriter->writeAttribute('xlink:href', $xlink);
-									$xmlWriter->endElement();// {$wfsNs}:{$fldName}
-								} else {
-									throw new Exception("Error Processing Request - too many refs for ".$acl->getName().".{$itemKey}/{$fldName}");
-								}
 							} else {
-								$value = str_replace('&', '&', $item[$fldName]);
-								if (empty($value) && '0' !== $value) {
-									continue;
-								} else {
-									$xmlWriter->startElement("{$wfsNs}:{$fldName}");
-										if (!$simple && !$acl->canReadObjectField($fldName, (object)$item)) {
-											$xmlWriter->writeAttribute("{$rootWfsNs}:allow_read", "false");
-										}
-										if (!$simple && !$acl->canWriteObjectField($fldName, (object)$item)) {
-											$xmlWriter->writeAttribute("{$rootWfsNs}:allow_write", "true");
-										}
-										$xmlWriter->text($value);
-									$xmlWriter->endElement();// {$wfsNs}:{$fldName}
-								}
+								throw new Exception("Error Processing Request - too many refs for ".$acl->getName().".{$itemKey}/{$fldName}");
+							}
+						} else {
+							$value = str_replace('&', '&', $item[$fldName]);
+							if (empty($value) && '0' !== $value) {
+								continue;
+							} else {
+								$xmlWriter->startElement("{$wfsNs}:{$fldName}");
+									if (!$simple && !$acl->canReadObjectField($fldName, (object)$item)) {
+										$xmlWriter->writeAttribute("{$rootWfsNs}:allow_read", "false");
+									}
+									if (!$simple && !$acl->canWriteObjectField($fldName, (object)$item)) {
+										$xmlWriter->writeAttribute("{$rootWfsNs}:allow_write", "true");
+									}
+									$xmlWriter->text($value);
+								$xmlWriter->endElement();// {$wfsNs}:{$fldName}
 							}
 						}
 					}

+ 6 - 5
SE/se-lib/Api/WfsQgisServer.php

@@ -128,10 +128,11 @@ if($DBG){echo '(geomFld: '.$geomFld.'):';print_r($acl->getFieldType($geomFld));e
 		$dbgLoop = 0;
 		$this->DBG("before loop...", __LINE__, __FUNCTION__, __CLASS__);
 		foreach ($items as $itemKey => $item) {
+			$item = (array)$item;
 			if (0 == (++$dbgLoop) % 500) $this->DBG("items loop:{$dbgLoop}", __LINE__, __FUNCTION__, __CLASS__);
-			if($DBG){echo 'item['.$itemKey.'] ('.$geomFld.')isEmpty('.empty($item->{$geomFld}).'):';print_r($item->{$geomFld});echo "\n";}
+			if($DBG){echo 'item['.$itemKey.'] ('.$geomFld.')isEmpty('.empty($item[$geomFld]).'):' . var_export($item[$geomFld], true) . "\n";}
 			if ($geomFld) {
-				if (empty($item->{$geomFld})) {
+				if (empty($item[$geomFld])) {
 					continue;// QGIS crash when WFS contain features with empty geom field
 				}
 			}
@@ -140,14 +141,14 @@ if($DBG){echo '(geomFld: '.$geomFld.'):';print_r($acl->getFieldType($geomFld));e
 					$xmlWriter->writeAttribute('fid', "{$type}.{$itemKey}");
 					foreach ($fldList as $idZasob => $fldName) {
 						// if (!$acl->isAllowed($idZasob, 'R', $item)) {echo '<!-- '."[{$idZasob}]({$fldName}) not allowed to read: ";print_r($item);echo' -->';}
-						if (!$acl->isAllowed($idZasob, 'R', $item)) continue;
+						if (!$acl->canReadObjectField($fldName, (object)$item)) continue;
 						// if ($acl->isGeomField($fldName)) // BUG: wolno
 						if ($geomFld != null && $fldName == $geomFld) {
 							$xmlWriter->startElement("{$wfsNs}:{$fldName}");
-								$this->_typeConverter->createGmlFromWkt_xmlWriter($item->{$fldName}, $xmlWriter);
+								$this->_typeConverter->createGmlFromWkt_xmlWriter($item[$fldName], $xmlWriter);
 							$xmlWriter->endElement();// {$wfsNs}:{$fldName}
 						} else {
-							$value = str_replace('&', '&amp;', $item->{$fldName});
+							$value = str_replace('&', '&amp;', $item[$fldName]);
 							if (empty($value) && '0' !== $value) {
 								continue;
 							} else {

+ 12 - 34
SE/se-lib/Core/AclSimpleSchemaBase.php

@@ -214,40 +214,18 @@ class Core_AclSimpleSchemaBase extends Core_AclBase {
 	}
 
   // TODO: replace legacy functions: isAllowed, hasFieldPerm, getFieldIdByName
-  public function canCreateField($fieldName) {
-    return false;// TODO: perms from Procesy
-  }
-  public function canReadField($fieldName) {
-    return true;// TODO: perms from Procesy
-  }
-  public function canReadObjectField($fieldName, $record) {
-    return true;// TODO: perms from Procesy
-  }
-  public function canWriteField($fieldName) {
-    return false;// TODO: perms from Procesy
-  }
-  public function canWriteObjectField($fieldName, $record) {
-    return false;// TODO: perms from Procesy
-  }
-
-  public function getTotal($params = array()) {// TODO: use ParseOgcQuery
-    throw new Exception("Unimplemented - TODO: F." . __FUNCTION__);
-  }
-  public function getItem($primaryKey) {
-    throw new Exception("Unimplemented - TODO: F." . __FUNCTION__);
-  }
-  public function getItems($params = array()) {// TODO: use ParseOgcQuery
-    throw new Exception("Unimplemented - TODO: F." . __FUNCTION__);
-  }
-  public function fetchItemRef(&$items) {
-    throw new Exception("Unimplemented - TODO: F." . __FUNCTION__);
-  }
-  public function addItem($itemTodo) {
-    throw new Exception("Unimplemented - TODO: F." . __FUNCTION__);
-  }
-  public function updateItem($itemPatch) {
-    throw new Exception("Unimplemented - TODO: F." . __FUNCTION__);
-  }
+  public function canCreateField($fieldName) { return false; }// TODO: perms from Procesy
+  public function canReadField($fieldName) { return true; }// TODO: perms from Procesy
+  public function canReadObjectField($fieldName, $record) { return true; }// TODO: perms from Procesy
+  public function canWriteField($fieldName) { return false; }// TODO: perms from Procesy
+  public function canWriteObjectField($fieldName, $record) { return false; }// TODO: perms from Procesy
+
+  public function getTotal($params = array()) { throw new Exception("Unimplemented - TODO: F." . __FUNCTION__); }// TODO: use ParseOgcQuery
+  public function getItem($primaryKey) { throw new Exception("Unimplemented - TODO: F." . __FUNCTION__); }
+  public function getItems($params = array()) { throw new Exception("Unimplemented - TODO: F." . __FUNCTION__); }// TODO: use ParseOgcQuery
+  public function fetchItemRef(&$items) { throw new Exception("Unimplemented - TODO: F." . __FUNCTION__); }
+  public function addItem($itemTodo) { throw new Exception("Unimplemented - TODO: F." . __FUNCTION__); }
+  public function updateItem($itemPatch) { throw new Exception("Unimplemented - TODO: F." . __FUNCTION__); }
 
   public function getGeomFieldType($fieldName) { return null; }
   public function getPrimaryKeyField() { return 'ID'; }

+ 1 - 1
SE/se-lib/Schema/TestPermsStorageAcl.php

@@ -144,7 +144,7 @@ class Schema_TestPermsStorageAcl extends Core_AclBase {
     return $this->parentAcl->updateItem($itemPatch);
   }
 
-  public function getGeomFieldType($fieldName) { return null; }
+  public function getGeomFieldType($fieldName) { return ('the_geom' == $fieldName) ? 'polygon' : null; }
   public function getPrimaryKeyField() { return 'ID'; }
   public function getID() { return 0; }
   public function getAttributesFromZasoby() { return array(); }

+ 8 - 2
SE/se-lib/TableAcl.php

@@ -313,9 +313,15 @@ class TableAcl extends Core_AclBase {
 		if ('A_RECORD_CREATE_AUTHOR' == $fieldName) return true;
 		if ('A_RECORD_UPDATE_DATE' == $fieldName) return true;
 		if ('A_RECORD_UPDATE_AUTHOR' == $fieldName) return true;
-		if (!$record) return false;
+		if (!$record) {
+			if(V::get('DBG_ACL', '', $_REQUEST) > 2){echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">canReadObjectField('.$fieldName.', $record) - record not set - return false (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): '.var_export($record, true).'</pre>';}
+			return false;
+		}
 		$idZasob = $this->getFieldIdByName($fieldName);
-		if (!$idZasob) return false;
+		if (!$idZasob) {
+			if(V::get('DBG_ACL', '', $_REQUEST) > 2){echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">canReadObjectField('.$fieldName.', $record) - $idZasob not set - return false (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): '.var_export($record, true).'</pre>';}
+			return false;
+		}
 		if (!$this->hasFieldPerm($idZasob, $taskPerm = 'R')) {
 			if ($this->hasFieldPerm($idZasob, 'V')) return true;
 			return ($this->hasFieldPerm($idZasob, 'O') && ($this->canReadRecord($record) || $this->canWriteRecord($record)));// 'WO' or 'CO'