--- view_own.module	2008-09-04 05:19:48.000000000 +0100
+++ view_own.module	2008-10-20 14:37:05.381000000 +0100
@@ -35,6 +35,18 @@
       $perms[] = 'view any '. $type->type .' content';
     }
   }
+    if (module_exists('content')) {
+      $fields = content_fields();
+      foreach ($fields as $field) {
+	$field_name = $field['field_name'];
+	$type = $field['type_name'];
+	if ($field['module'] == 'nodereference' || $field['module'] == 'userreference') {
+	  $perms[] = "view $type content via $field_name";
+	  $perms[] = "edit $type content via $field_name";
+	  $perms[] = "delete $type content via $field_name";
+	}
+      }
+    }
   return $perms;
 }
 
@@ -94,6 +106,56 @@
         'grant_delete' => $delete_perm,
         'priority' => 0,
       );
+      // -- access via selected field reference
+	if (module_exists('content')) {
+	  $fields = content_fields();
+	  foreach ($fields as $field) {
+	    $field_name = $field['field_name'];
+	    if ($field['type_name'] == $node->type) {
+		$view_via_ref_content = "view $node->type content via $field_name";
+		$edit_via_ref_content = "edit $node->type content via $field_name";
+		$delete_via_ref_content = "delete $node->type content via $field_name";
+
+		if ($field['module'] == 'nodereference') {
+		    $nid = $node->{$field_name}[0]['nid'];
+		    $uid = $node->uid;
+		    $type = $field['type_name'];
+		    $permission = $edit_via_ref_content;
+		    $edit_perm = in_array($permission, $default_permissions[$rid])  ? 1 : 0;
+		    $permission = $delete_via_ref_content;
+		    $edit_perm = in_array($permission, $default_permissions[$rid])  ? 1 : 0;
+		    $view_any_content = $view_via_ref_content;
+		    $view_perm = (($edit_perm || $delete_perm) ? 1 : in_array($view_any_content, $default_permissions[$rid]));
+		    $grants[] = array(
+			'realm' => 'view_own_owner',
+			'gid' => $uid,
+			'grant_view' => $view_perm,
+			'grant_update' => $edit_perm,
+			'grant_delete' => $delete_perm,
+			'priority' => 0,
+		    );
+		}
+		if ($field['module'] == 'userreference') {
+		    $uid = $node->{$field_name}[0]['uid'];
+		    $type = $field['type_name'];
+		    $permission = $edit_via_ref_content;
+		    $edit_perm = in_array($permission, $default_permissions[$rid])  ? 1 : 0;
+		    $permission = $delete_via_ref_content;
+		    $edit_perm = in_array($permission, $default_permissions[$rid])  ? 1 : 0;
+		    $view_any_content = $view_via_ref_content;
+		    $view_perm = (($edit_perm || $delete_perm) ? 1 : in_array($view_any_content, $default_permissions[$rid]));
+		    $grants[] = array(
+			'realm' => 'view_own_owner',
+			'gid' => $uid,
+			'grant_view' => $view_perm,
+			'grant_update' => $edit_perm,
+			'grant_delete' => $delete_perm,
+			'priority' => 0,
+		    );
+		}
+	    }
+	  }
+	}
     }
   }
   return $grants;
