Переглянути джерело

don't use the accesslevel attribute for variabletype nodes

Julius Pfrommer 7 роки тому
батько
коміт
517a5ae8f5
1 змінених файлів з 8 додано та 5 видалено
  1. 8 5
      src/server/ua_services_attribute.c

+ 8 - 5
src/server/ua_services_attribute.c

@@ -231,11 +231,14 @@ Operation_Read(UA_Server *server, UA_Session *session,
         break;
     case UA_ATTRIBUTEID_VALUE: {
         CHECK_NODECLASS(UA_NODECLASS_VARIABLE | UA_NODECLASS_VARIABLETYPE);
-        UA_Byte userAccessLevel = getUserAccessLevel(server, session,
-                                                     (const UA_VariableNode*)node);
-        if(!(userAccessLevel & (UA_ACCESSLEVELMASK_READ))) {
-            retval = UA_STATUSCODE_BADUSERACCESSDENIED;
-            break;
+        /* VariableTypes don't have the AccessLevel concept. Always allow reading the value. */
+        if(node->nodeClass == UA_NODECLASS_VARIABLE) {
+            UA_Byte userAccessLevel = getUserAccessLevel(server, session,
+                                                         (const UA_VariableNode*)node);
+            if(!(userAccessLevel & (UA_ACCESSLEVELMASK_READ))) {
+                retval = UA_STATUSCODE_BADUSERACCESSDENIED;
+                break;
+            }
         }
         retval = readValueAttributeComplete(server, session, (const UA_VariableNode*)node,
                                             op_timestampsToReturn, &id->indexRange, v);