ua_server_binary.c 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687
  1. #include "ua_util.h"
  2. #include "ua_server_internal.h"
  3. #include "ua_services.h"
  4. #include "ua_securechannel_manager.h"
  5. #include "ua_session_manager.h"
  6. #include "ua_types_generated_encoding_binary.h"
  7. #include "ua_transport_generated.h"
  8. #include "ua_transport_generated_encoding_binary.h"
  9. /********************/
  10. /* Helper Functions */
  11. /********************/
  12. static void init_response_header(const UA_RequestHeader *p, UA_ResponseHeader *r) {
  13. r->requestHandle = p->requestHandle;
  14. r->timestamp = UA_DateTime_now();
  15. }
  16. static void
  17. sendError(UA_SecureChannel *channel, const UA_ByteString *msg, size_t offset, const UA_DataType *responseType,
  18. UA_UInt32 requestId, UA_StatusCode error) {
  19. UA_RequestHeader requestHeader;
  20. UA_StatusCode retval = UA_RequestHeader_decodeBinary(msg, &offset, &requestHeader);
  21. if(retval != UA_STATUSCODE_GOOD)
  22. return;
  23. void *response = UA_alloca(responseType->memSize);
  24. UA_init(response, responseType);
  25. UA_ResponseHeader *responseHeader = (UA_ResponseHeader*)response;
  26. init_response_header(&requestHeader, responseHeader);
  27. responseHeader->serviceResult = error;
  28. UA_SecureChannel_sendBinaryMessage(channel, requestId, response, responseType);
  29. UA_RequestHeader_deleteMembers(&requestHeader);
  30. UA_ResponseHeader_deleteMembers(responseHeader);
  31. }
  32. /* Returns a complete decoded request (without securechannel headers + padding)
  33. or UA_BYTESTRING_NULL */
  34. static UA_ByteString processChunk(UA_SecureChannel *channel, UA_Server *server,
  35. const UA_TcpMessageHeader *messageHeader, UA_UInt32 requestId,
  36. const UA_ByteString *msg, size_t offset, size_t chunksize,
  37. UA_Boolean *deleteRequest) {
  38. UA_ByteString bytes = UA_BYTESTRING_NULL;
  39. switch(messageHeader->messageTypeAndChunkType & 0xff000000) {
  40. case UA_CHUNKTYPE_INTERMEDIATE:
  41. UA_LOG_TRACE_CHANNEL(server->config.logger, channel, "Chunk message");
  42. UA_SecureChannel_appendChunk(channel, requestId, msg, offset, chunksize);
  43. break;
  44. case UA_CHUNKTYPE_FINAL:
  45. UA_LOG_TRACE_CHANNEL(server->config.logger, channel, "Final chunk message");
  46. bytes = UA_SecureChannel_finalizeChunk(channel, requestId, msg, offset, chunksize, deleteRequest);
  47. break;
  48. case UA_CHUNKTYPE_ABORT:
  49. UA_LOG_INFO_CHANNEL(server->config.logger, channel, "Chunk aborted");
  50. UA_SecureChannel_removeChunk(channel, requestId);
  51. break;
  52. default:
  53. UA_LOG_INFO_CHANNEL(server->config.logger, channel, "Unknown chunk type");
  54. }
  55. return bytes;
  56. }
  57. static void
  58. getServicePointers(UA_UInt32 requestTypeId, const UA_DataType **requestType,
  59. const UA_DataType **responseType, UA_Service *service,
  60. UA_Boolean *requiresSession) {
  61. switch(requestTypeId - UA_ENCODINGOFFSET_BINARY) {
  62. case UA_NS0ID_GETENDPOINTSREQUEST:
  63. *service = (UA_Service)Service_GetEndpoints;
  64. *requestType = &UA_TYPES[UA_TYPES_GETENDPOINTSREQUEST];
  65. *responseType = &UA_TYPES[UA_TYPES_GETENDPOINTSRESPONSE];
  66. *requiresSession = false;
  67. break;
  68. case UA_NS0ID_FINDSERVERSREQUEST:
  69. *service = (UA_Service)Service_FindServers;
  70. *requestType = &UA_TYPES[UA_TYPES_FINDSERVERSREQUEST];
  71. *responseType = &UA_TYPES[UA_TYPES_FINDSERVERSRESPONSE];
  72. *requiresSession = false;
  73. break;
  74. #ifdef UA_ENABLE_DISCOVERY
  75. case UA_NS0ID_REGISTERSERVERREQUEST:
  76. *service = (UA_Service)Service_RegisterServer;
  77. *requestType = &UA_TYPES[UA_TYPES_REGISTERSERVERREQUEST];
  78. *responseType = &UA_TYPES[UA_TYPES_REGISTERSERVERRESPONSE];
  79. break;
  80. #endif
  81. case UA_NS0ID_CREATESESSIONREQUEST:
  82. *service = (UA_Service)Service_CreateSession;
  83. *requestType = &UA_TYPES[UA_TYPES_CREATESESSIONREQUEST];
  84. *responseType = &UA_TYPES[UA_TYPES_CREATESESSIONRESPONSE];
  85. *requiresSession = false;
  86. break;
  87. case UA_NS0ID_ACTIVATESESSIONREQUEST:
  88. *service = (UA_Service)Service_ActivateSession;
  89. *requestType = &UA_TYPES[UA_TYPES_ACTIVATESESSIONREQUEST];
  90. *responseType = &UA_TYPES[UA_TYPES_ACTIVATESESSIONRESPONSE];
  91. break;
  92. case UA_NS0ID_CLOSESESSIONREQUEST:
  93. *service = (UA_Service)Service_CloseSession;
  94. *requestType = &UA_TYPES[UA_TYPES_CLOSESESSIONREQUEST];
  95. *responseType = &UA_TYPES[UA_TYPES_CLOSESESSIONRESPONSE];
  96. break;
  97. case UA_NS0ID_READREQUEST:
  98. *service = (UA_Service)Service_Read;
  99. *requestType = &UA_TYPES[UA_TYPES_READREQUEST];
  100. *responseType = &UA_TYPES[UA_TYPES_READRESPONSE];
  101. break;
  102. case UA_NS0ID_WRITEREQUEST:
  103. *service = (UA_Service)Service_Write;
  104. *requestType = &UA_TYPES[UA_TYPES_WRITEREQUEST];
  105. *responseType = &UA_TYPES[UA_TYPES_WRITERESPONSE];
  106. break;
  107. case UA_NS0ID_BROWSEREQUEST:
  108. *service = (UA_Service)Service_Browse;
  109. *requestType = &UA_TYPES[UA_TYPES_BROWSEREQUEST];
  110. *responseType = &UA_TYPES[UA_TYPES_BROWSERESPONSE];
  111. break;
  112. case UA_NS0ID_BROWSENEXTREQUEST:
  113. *service = (UA_Service)Service_BrowseNext;
  114. *requestType = &UA_TYPES[UA_TYPES_BROWSENEXTREQUEST];
  115. *responseType = &UA_TYPES[UA_TYPES_BROWSENEXTRESPONSE];
  116. break;
  117. case UA_NS0ID_REGISTERNODESREQUEST:
  118. *service = (UA_Service)Service_RegisterNodes;
  119. *requestType = &UA_TYPES[UA_TYPES_REGISTERNODESREQUEST];
  120. *responseType = &UA_TYPES[UA_TYPES_REGISTERNODESRESPONSE];
  121. break;
  122. case UA_NS0ID_UNREGISTERNODESREQUEST:
  123. *service = (UA_Service)Service_UnregisterNodes;
  124. *requestType = &UA_TYPES[UA_TYPES_UNREGISTERNODESREQUEST];
  125. *responseType = &UA_TYPES[UA_TYPES_UNREGISTERNODESRESPONSE];
  126. break;
  127. case UA_NS0ID_TRANSLATEBROWSEPATHSTONODEIDSREQUEST:
  128. *service = (UA_Service)Service_TranslateBrowsePathsToNodeIds;
  129. *requestType = &UA_TYPES[UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSREQUEST];
  130. *responseType = &UA_TYPES[UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSRESPONSE];
  131. break;
  132. #ifdef UA_ENABLE_SUBSCRIPTIONS
  133. case UA_NS0ID_CREATESUBSCRIPTIONREQUEST:
  134. *service = (UA_Service)Service_CreateSubscription;
  135. *requestType = &UA_TYPES[UA_TYPES_CREATESUBSCRIPTIONREQUEST];
  136. *responseType = &UA_TYPES[UA_TYPES_CREATESUBSCRIPTIONRESPONSE];
  137. break;
  138. case UA_NS0ID_PUBLISHREQUEST:
  139. *requestType = &UA_TYPES[UA_TYPES_PUBLISHREQUEST];
  140. *responseType = &UA_TYPES[UA_TYPES_PUBLISHRESPONSE];
  141. break;
  142. case UA_NS0ID_REPUBLISHREQUEST:
  143. *service = (UA_Service)Service_Republish;
  144. *requestType = &UA_TYPES[UA_TYPES_REPUBLISHREQUEST];
  145. *responseType = &UA_TYPES[UA_TYPES_REPUBLISHRESPONSE];
  146. break;
  147. case UA_NS0ID_MODIFYSUBSCRIPTIONREQUEST:
  148. *service = (UA_Service)Service_ModifySubscription;
  149. *requestType = &UA_TYPES[UA_TYPES_MODIFYSUBSCRIPTIONREQUEST];
  150. *responseType = &UA_TYPES[UA_TYPES_MODIFYSUBSCRIPTIONRESPONSE];
  151. break;
  152. case UA_NS0ID_SETPUBLISHINGMODEREQUEST:
  153. *service = (UA_Service)Service_SetPublishingMode;
  154. *requestType = &UA_TYPES[UA_TYPES_SETPUBLISHINGMODEREQUEST];
  155. *responseType = &UA_TYPES[UA_TYPES_SETPUBLISHINGMODERESPONSE];
  156. break;
  157. case UA_NS0ID_DELETESUBSCRIPTIONSREQUEST:
  158. *service = (UA_Service)Service_DeleteSubscriptions;
  159. *requestType = &UA_TYPES[UA_TYPES_DELETESUBSCRIPTIONSREQUEST];
  160. *responseType = &UA_TYPES[UA_TYPES_DELETESUBSCRIPTIONSRESPONSE];
  161. break;
  162. case UA_NS0ID_CREATEMONITOREDITEMSREQUEST:
  163. *service = (UA_Service)Service_CreateMonitoredItems;
  164. *requestType = &UA_TYPES[UA_TYPES_CREATEMONITOREDITEMSREQUEST];
  165. *responseType = &UA_TYPES[UA_TYPES_CREATEMONITOREDITEMSRESPONSE];
  166. break;
  167. case UA_NS0ID_DELETEMONITOREDITEMSREQUEST:
  168. *service = (UA_Service)Service_DeleteMonitoredItems;
  169. *requestType = &UA_TYPES[UA_TYPES_DELETEMONITOREDITEMSREQUEST];
  170. *responseType = &UA_TYPES[UA_TYPES_DELETEMONITOREDITEMSRESPONSE];
  171. break;
  172. case UA_NS0ID_MODIFYMONITOREDITEMSREQUEST:
  173. *service = (UA_Service)Service_ModifyMonitoredItems;
  174. *requestType = &UA_TYPES[UA_TYPES_MODIFYMONITOREDITEMSREQUEST];
  175. *responseType = &UA_TYPES[UA_TYPES_MODIFYMONITOREDITEMSRESPONSE];
  176. break;
  177. case UA_NS0ID_SETMONITORINGMODEREQUEST:
  178. *service = (UA_Service)Service_SetMonitoringMode;
  179. *requestType = &UA_TYPES[UA_TYPES_SETMONITORINGMODEREQUEST];
  180. *responseType = &UA_TYPES[UA_TYPES_SETMONITORINGMODERESPONSE];
  181. break;
  182. #endif
  183. #ifdef UA_ENABLE_METHODCALLS
  184. case UA_NS0ID_CALLREQUEST:
  185. *service = (UA_Service)Service_Call;
  186. *requestType = &UA_TYPES[UA_TYPES_CALLREQUEST];
  187. *responseType = &UA_TYPES[UA_TYPES_CALLRESPONSE];
  188. break;
  189. #endif
  190. #ifdef UA_ENABLE_NODEMANAGEMENT
  191. case UA_NS0ID_ADDNODESREQUEST:
  192. *service = (UA_Service)Service_AddNodes;
  193. *requestType = &UA_TYPES[UA_TYPES_ADDNODESREQUEST];
  194. *responseType = &UA_TYPES[UA_TYPES_ADDNODESRESPONSE];
  195. break;
  196. case UA_NS0ID_ADDREFERENCESREQUEST:
  197. *service = (UA_Service)Service_AddReferences;
  198. *requestType = &UA_TYPES[UA_TYPES_ADDREFERENCESREQUEST];
  199. *responseType = &UA_TYPES[UA_TYPES_ADDREFERENCESRESPONSE];
  200. break;
  201. case UA_NS0ID_DELETENODESREQUEST:
  202. *service = (UA_Service)Service_DeleteNodes;
  203. *requestType = &UA_TYPES[UA_TYPES_DELETENODESREQUEST];
  204. *responseType = &UA_TYPES[UA_TYPES_DELETENODESRESPONSE];
  205. break;
  206. case UA_NS0ID_DELETEREFERENCESREQUEST:
  207. *service = (UA_Service)Service_DeleteReferences;
  208. *requestType = &UA_TYPES[UA_TYPES_DELETEREFERENCESREQUEST];
  209. *responseType = &UA_TYPES[UA_TYPES_DELETEREFERENCESRESPONSE];
  210. break;
  211. #endif
  212. default:
  213. break;
  214. }
  215. }
  216. /*************************/
  217. /* Process Message Types */
  218. /*************************/
  219. /* HEL -> Open up the connection */
  220. static void processHEL(UA_Connection *connection, const UA_ByteString *msg, size_t *offset) {
  221. UA_TcpHelloMessage helloMessage;
  222. if(UA_TcpHelloMessage_decodeBinary(msg, offset, &helloMessage) != UA_STATUSCODE_GOOD) {
  223. connection->close(connection);
  224. return;
  225. }
  226. connection->state = UA_CONNECTION_ESTABLISHED;
  227. connection->remoteConf.maxChunkCount = helloMessage.maxChunkCount;
  228. connection->remoteConf.maxMessageSize = helloMessage.maxMessageSize;
  229. connection->remoteConf.protocolVersion = helloMessage.protocolVersion;
  230. connection->remoteConf.recvBufferSize = helloMessage.receiveBufferSize;
  231. if(connection->localConf.sendBufferSize > helloMessage.receiveBufferSize)
  232. connection->localConf.sendBufferSize = helloMessage.receiveBufferSize;
  233. if(connection->localConf.recvBufferSize > helloMessage.sendBufferSize)
  234. connection->localConf.recvBufferSize = helloMessage.sendBufferSize;
  235. connection->remoteConf.sendBufferSize = helloMessage.sendBufferSize;
  236. UA_TcpHelloMessage_deleteMembers(&helloMessage);
  237. /* Build acknowledge response */
  238. UA_TcpAcknowledgeMessage ackMessage;
  239. ackMessage.protocolVersion = connection->localConf.protocolVersion;
  240. ackMessage.receiveBufferSize = connection->localConf.recvBufferSize;
  241. ackMessage.sendBufferSize = connection->localConf.sendBufferSize;
  242. ackMessage.maxMessageSize = connection->localConf.maxMessageSize;
  243. ackMessage.maxChunkCount = connection->localConf.maxChunkCount;
  244. UA_TcpMessageHeader ackHeader;
  245. ackHeader.messageTypeAndChunkType = UA_MESSAGETYPE_ACK + UA_CHUNKTYPE_FINAL;
  246. ackHeader.messageSize = 8 + 20; /* ackHeader + ackMessage */
  247. UA_ByteString ack_msg;
  248. UA_ByteString_init(&ack_msg);
  249. if(connection->getSendBuffer(connection, connection->localConf.sendBufferSize, &ack_msg) != UA_STATUSCODE_GOOD)
  250. return;
  251. size_t tmpPos = 0;
  252. UA_TcpMessageHeader_encodeBinary(&ackHeader, &ack_msg, &tmpPos);
  253. UA_TcpAcknowledgeMessage_encodeBinary(&ackMessage, &ack_msg, &tmpPos);
  254. ack_msg.length = ackHeader.messageSize;
  255. connection->send(connection, &ack_msg);
  256. }
  257. /* OPN -> Open up/renew the securechannel */
  258. static void processOPN(UA_Connection *connection, UA_Server *server, const UA_ByteString *msg, size_t *offset) {
  259. if(connection->state != UA_CONNECTION_ESTABLISHED) {
  260. connection->close(connection);
  261. return;
  262. }
  263. UA_UInt32 channelId;
  264. UA_StatusCode retval = UA_UInt32_decodeBinary(msg, offset, &channelId);
  265. /* Opening up a channel with a channelid already set */
  266. if(!connection->channel && channelId != 0)
  267. retval |= UA_STATUSCODE_BADREQUESTTYPEINVALID;
  268. /* Renew a channel with the wrong channelid */
  269. if(connection->channel && channelId != connection->channel->securityToken.channelId)
  270. retval |= UA_STATUSCODE_BADREQUESTTYPEINVALID;
  271. UA_AsymmetricAlgorithmSecurityHeader asymHeader;
  272. retval |= UA_AsymmetricAlgorithmSecurityHeader_decodeBinary(msg, offset, &asymHeader);
  273. UA_SequenceHeader seqHeader;
  274. retval |= UA_SequenceHeader_decodeBinary(msg, offset, &seqHeader);
  275. UA_NodeId requestType;
  276. retval |= UA_NodeId_decodeBinary(msg, offset, &requestType);
  277. UA_OpenSecureChannelRequest r;
  278. retval |= UA_OpenSecureChannelRequest_decodeBinary(msg, offset, &r);
  279. if(retval != UA_STATUSCODE_GOOD || requestType.identifier.numeric != 446) {
  280. UA_AsymmetricAlgorithmSecurityHeader_deleteMembers(&asymHeader);
  281. UA_NodeId_deleteMembers(&requestType);
  282. UA_OpenSecureChannelRequest_deleteMembers(&r);
  283. connection->close(connection);
  284. return;
  285. }
  286. UA_OpenSecureChannelResponse p;
  287. UA_OpenSecureChannelResponse_init(&p);
  288. Service_OpenSecureChannel(server, connection, &r, &p);
  289. UA_OpenSecureChannelRequest_deleteMembers(&r);
  290. UA_SecureChannel *channel = connection->channel;
  291. /* Opening the channel failed */
  292. if(!channel) {
  293. UA_OpenSecureChannelResponse_deleteMembers(&p);
  294. UA_AsymmetricAlgorithmSecurityHeader_deleteMembers(&asymHeader);
  295. connection->close(connection);
  296. return;
  297. }
  298. /* Set the starting sequence number */
  299. channel->receiveSequenceNumber = seqHeader.sequenceNumber;
  300. /* Allocate the return message */
  301. UA_ByteString resp_msg;
  302. UA_ByteString_init(&resp_msg);
  303. retval = connection->getSendBuffer(connection, connection->localConf.sendBufferSize, &resp_msg);
  304. if(retval != UA_STATUSCODE_GOOD) {
  305. UA_OpenSecureChannelResponse_deleteMembers(&p);
  306. UA_AsymmetricAlgorithmSecurityHeader_deleteMembers(&asymHeader);
  307. connection->close(connection);
  308. return;
  309. }
  310. /* Encode the message after the secureconversationmessageheader */
  311. size_t tmpPos = 12; /* skip the header */
  312. #ifndef UA_ENABLE_MULTITHREADING
  313. seqHeader.sequenceNumber = ++channel->sendSequenceNumber;
  314. #else
  315. seqHeader.sequenceNumber = uatomic_add_return(&channel->sendSequenceNumber, 1);
  316. #endif
  317. retval |= UA_AsymmetricAlgorithmSecurityHeader_encodeBinary(&asymHeader, &resp_msg, &tmpPos); // just mirror back
  318. retval |= UA_SequenceHeader_encodeBinary(&seqHeader, &resp_msg, &tmpPos);
  319. UA_NodeId responseType = UA_NODEID_NUMERIC(0, UA_NS0ID_OPENSECURECHANNELRESPONSE + UA_ENCODINGOFFSET_BINARY);
  320. retval |= UA_NodeId_encodeBinary(&responseType, &resp_msg, &tmpPos);
  321. retval |= UA_OpenSecureChannelResponse_encodeBinary(&p, &resp_msg, &tmpPos);
  322. if(retval != UA_STATUSCODE_GOOD) {
  323. connection->releaseSendBuffer(connection, &resp_msg);
  324. UA_OpenSecureChannelResponse_deleteMembers(&p);
  325. UA_AsymmetricAlgorithmSecurityHeader_deleteMembers(&asymHeader);
  326. connection->close(connection);
  327. return;
  328. }
  329. /* Encode the secureconversationmessageheader */
  330. UA_SecureConversationMessageHeader respHeader;
  331. respHeader.messageHeader.messageTypeAndChunkType = UA_MESSAGETYPE_OPN + UA_CHUNKTYPE_FINAL;
  332. respHeader.messageHeader.messageSize = (UA_UInt32)tmpPos;
  333. respHeader.secureChannelId = p.securityToken.channelId;
  334. tmpPos = 0;
  335. UA_SecureConversationMessageHeader_encodeBinary(&respHeader, &resp_msg, &tmpPos);
  336. resp_msg.length = respHeader.messageHeader.messageSize;
  337. connection->send(connection, &resp_msg);
  338. /* Clean up */
  339. UA_OpenSecureChannelResponse_deleteMembers(&p);
  340. UA_AsymmetricAlgorithmSecurityHeader_deleteMembers(&asymHeader);
  341. }
  342. static void
  343. processRequest(UA_SecureChannel *channel, UA_Server *server, UA_UInt32 requestId, const UA_ByteString *msg) {
  344. /* At 0, the nodeid starts... */
  345. size_t ppos = 0;
  346. size_t *offset = &ppos;
  347. /* Decode the nodeid */
  348. UA_NodeId requestTypeId;
  349. UA_StatusCode retval = UA_NodeId_decodeBinary(msg, offset, &requestTypeId);
  350. if(retval != UA_STATUSCODE_GOOD)
  351. return;
  352. /* Store the start-position of the request */
  353. size_t requestPos = *offset;
  354. /* Test if the service type nodeid has the right format */
  355. if(requestTypeId.identifierType != UA_NODEIDTYPE_NUMERIC ||
  356. requestTypeId.namespaceIndex != 0) {
  357. UA_NodeId_deleteMembers(&requestTypeId);
  358. UA_LOG_DEBUG_CHANNEL(server->config.logger, channel, "Received a non-numeric message type NodeId");
  359. sendError(channel, msg, requestPos, &UA_TYPES[UA_TYPES_SERVICEFAULT], requestId, UA_STATUSCODE_BADSERVICEUNSUPPORTED);
  360. }
  361. /* Get the service pointers */
  362. UA_Service service = NULL;
  363. const UA_DataType *requestType = NULL;
  364. const UA_DataType *responseType = NULL;
  365. UA_Boolean sessionRequired = true;
  366. getServicePointers(requestTypeId.identifier.numeric, &requestType, &responseType, &service, &sessionRequired);
  367. if(!requestType) {
  368. if(requestTypeId.identifier.numeric == 787) {
  369. UA_LOG_INFO_CHANNEL(server->config.logger, channel,
  370. "Client requested a subscription, but those are not enabled in the build");
  371. } else {
  372. UA_LOG_INFO_CHANNEL(server->config.logger, channel, "Unknown request %i",
  373. requestTypeId.identifier.numeric - UA_ENCODINGOFFSET_BINARY);
  374. }
  375. sendError(channel, msg, requestPos, &UA_TYPES[UA_TYPES_SERVICEFAULT], requestId, UA_STATUSCODE_BADSERVICEUNSUPPORTED);
  376. return;
  377. }
  378. UA_assert(responseType);
  379. #ifdef UA_ENABLE_NONSTANDARD_STATELESS
  380. /* Stateless extension: Sessions are optional */
  381. sessionRequired = false;
  382. #endif
  383. /* Decode the request */
  384. void *request = UA_alloca(requestType->memSize);
  385. UA_RequestHeader *requestHeader = (UA_RequestHeader*)request;
  386. retval = UA_decodeBinary(msg, offset, request, requestType);
  387. if(retval != UA_STATUSCODE_GOOD) {
  388. UA_LOG_DEBUG_CHANNEL(server->config.logger, channel, "Could not decode the request");
  389. sendError(channel, msg, requestPos, responseType, requestId, retval);
  390. return;
  391. }
  392. /* Prepare the respone */
  393. void *response = UA_alloca(responseType->memSize);
  394. UA_init(response, responseType);
  395. /* CreateSession doesn't need a session */
  396. if(requestType == &UA_TYPES[UA_TYPES_CREATESESSIONREQUEST]) {
  397. Service_CreateSession(server, channel, request, response);
  398. goto send_response;
  399. }
  400. /* Find the matching session */
  401. UA_Session *session = UA_SecureChannel_getSession(channel, &requestHeader->authenticationToken);
  402. if(!session)
  403. session = UA_SessionManager_getSession(&server->sessionManager, &requestHeader->authenticationToken);
  404. if(requestType == &UA_TYPES[UA_TYPES_ACTIVATESESSIONREQUEST]) {
  405. if(!session) {
  406. UA_LOG_DEBUG_CHANNEL(server->config.logger, channel, "Trying to activate a session that is not known in the server");
  407. sendError(channel, msg, requestPos, responseType, requestId, UA_STATUSCODE_BADSESSIONIDINVALID);
  408. UA_deleteMembers(request, requestType);
  409. return;
  410. }
  411. Service_ActivateSession(server, channel, session, request, response);
  412. goto send_response;
  413. }
  414. /* Set an anonymous, inactive session for services that need no session */
  415. UA_Session anonymousSession;
  416. if(!session) {
  417. if(sessionRequired) {
  418. UA_LOG_INFO_CHANNEL(server->config.logger, channel, "Service request %i without a valid session",
  419. requestTypeId.identifier.numeric - UA_ENCODINGOFFSET_BINARY);
  420. sendError(channel, msg, requestPos, responseType, requestId, UA_STATUSCODE_BADSESSIONIDINVALID);
  421. UA_deleteMembers(request, requestType);
  422. return;
  423. }
  424. UA_Session_init(&anonymousSession);
  425. anonymousSession.sessionId = UA_NODEID_GUID(0, UA_GUID_NULL);
  426. anonymousSession.channel = channel;
  427. session = &anonymousSession;
  428. }
  429. /* Trying to use a non-activated session? */
  430. if(!session->activated && sessionRequired) {
  431. UA_LOG_INFO_SESSION(server->config.logger, session, "Calling service %i on a non-activated session",
  432. requestTypeId.identifier.numeric - UA_ENCODINGOFFSET_BINARY);
  433. sendError(channel, msg, requestPos, responseType, requestId, UA_STATUSCODE_BADSESSIONNOTACTIVATED);
  434. UA_SessionManager_removeSession(&server->sessionManager, &session->authenticationToken);
  435. UA_deleteMembers(request, requestType);
  436. return;
  437. }
  438. /* The session is bound to another channel */
  439. if(session->channel != channel) {
  440. UA_LOG_DEBUG_CHANNEL(server->config.logger, channel, "Client tries to use an obsolete securechannel");
  441. sendError(channel, msg, requestPos, responseType, requestId, UA_STATUSCODE_BADSECURECHANNELIDINVALID);
  442. UA_deleteMembers(request, requestType);
  443. return;
  444. }
  445. /* Update the session lifetime */
  446. UA_Session_updateLifetime(session);
  447. #ifdef UA_ENABLE_SUBSCRIPTIONS
  448. /* The publish request is not answered immediately */
  449. if(requestType == &UA_TYPES[UA_TYPES_PUBLISHREQUEST]) {
  450. Service_Publish(server, session, request, requestId);
  451. UA_deleteMembers(request, requestType);
  452. return;
  453. }
  454. #endif
  455. /* Call the service */
  456. service(server, session, request, response);
  457. send_response:
  458. /* Send the response */
  459. init_response_header(request, response);
  460. retval = UA_SecureChannel_sendBinaryMessage(channel, requestId, response, responseType);
  461. if(retval != UA_STATUSCODE_GOOD)
  462. UA_LOG_INFO_CHANNEL(server->config.logger, channel, "Could not send the message over "
  463. "the SecureChannel with error code 0x%08x", retval);
  464. /* Clean up */
  465. UA_deleteMembers(request, requestType);
  466. UA_deleteMembers(response, responseType);
  467. }
  468. /* MSG -> Normal request */
  469. static void
  470. processMSG(UA_Connection *connection, UA_Server *server, const UA_TcpMessageHeader *messageHeader,
  471. const UA_ByteString *msg, size_t *offset) {
  472. /* Decode the header */
  473. UA_UInt32 channelId = 0;
  474. UA_UInt32 tokenId = 0;
  475. UA_SequenceHeader sequenceHeader;
  476. UA_StatusCode retval = UA_UInt32_decodeBinary(msg, offset, &channelId);
  477. retval |= UA_UInt32_decodeBinary(msg, offset, &tokenId);
  478. retval |= UA_SequenceHeader_decodeBinary(msg, offset, &sequenceHeader);
  479. if(retval != UA_STATUSCODE_GOOD)
  480. return;
  481. /* Get the SecureChannel */
  482. UA_SecureChannel *channel = connection->channel;
  483. UA_SecureChannel anonymousChannel; /* use if no channel specified */
  484. if(!channel) {
  485. UA_SecureChannel_init(&anonymousChannel);
  486. anonymousChannel.connection = connection;
  487. channel = &anonymousChannel;
  488. }
  489. /* Is the channel attached to connection? */
  490. if(channelId != channel->securityToken.channelId) {
  491. UA_LOG_INFO(server->config.logger, UA_LOGCATEGORY_NETWORK,
  492. "Connection %i | Received MSG with the channel id %i not bound to the connection",
  493. connection->sockfd, channelId);
  494. Service_CloseSecureChannel(server, channel);
  495. connection->close(connection);
  496. return;
  497. }
  498. /* Does the sequence number match? */
  499. retval = UA_SecureChannel_processSequenceNumber(sequenceHeader.sequenceNumber, channel);
  500. if (retval != UA_STATUSCODE_GOOD){
  501. UA_LOG_INFO_CHANNEL(server->config.logger, channel,
  502. "The sequence number was not increased by one. Got %i, expected %i",
  503. sequenceHeader.sequenceNumber, channel->receiveSequenceNumber + 1);
  504. sendError(channel, msg, *offset, &UA_TYPES[UA_TYPES_SERVICEFAULT],
  505. sequenceHeader.requestId, UA_STATUSCODE_BADSECURITYCHECKSFAILED);
  506. Service_CloseSecureChannel(server, channel);
  507. connection->close(connection);
  508. return;
  509. }
  510. /* Does the token match? */
  511. if(tokenId != channel->securityToken.tokenId) {
  512. if(tokenId != channel->nextSecurityToken.tokenId) {
  513. UA_LOG_INFO_CHANNEL(server->config.logger, channel,
  514. "Request with a wrong security token. Closing the SecureChannel.");
  515. Service_CloseSecureChannel(server, channel);
  516. connection->close(connection);
  517. return;
  518. }
  519. UA_SecureChannel_revolveTokens(channel);
  520. }
  521. /* Process chunk to get complete request */
  522. UA_Boolean deleteRequest = false;
  523. UA_ByteString request = processChunk(channel, server, messageHeader, sequenceHeader.requestId,
  524. msg, *offset, messageHeader->messageSize - 24, &deleteRequest);
  525. *offset += (messageHeader->messageSize - 24);
  526. if(request.length > 0) {
  527. /* Process the request */
  528. processRequest(channel, server, sequenceHeader.requestId, &request);
  529. if(deleteRequest)
  530. UA_ByteString_deleteMembers(&request);
  531. }
  532. /* Clean up a possible anonymous channel */
  533. if(channel == &anonymousChannel)
  534. UA_SecureChannel_deleteMembersCleanup(channel);
  535. }
  536. /* CLO -> Close the secure channel */
  537. static void
  538. processCLO(UA_Connection *connection, UA_Server *server, const UA_ByteString *msg, size_t *offset) {
  539. UA_UInt32 channelId;
  540. UA_UInt32 tokenId = 0;
  541. UA_SequenceHeader sequenceHeader;
  542. UA_StatusCode retval = UA_UInt32_decodeBinary(msg, offset, &channelId);
  543. retval |= UA_UInt32_decodeBinary(msg, offset, &tokenId);
  544. retval |= UA_SequenceHeader_decodeBinary(msg, offset, &sequenceHeader);
  545. if(retval != UA_STATUSCODE_GOOD)
  546. return;
  547. UA_SecureChannel *channel = connection->channel;
  548. if(!channel || channel->securityToken.channelId != channelId ||
  549. channel->securityToken.tokenId != tokenId)
  550. return;
  551. if(sequenceHeader.sequenceNumber != channel->receiveSequenceNumber + 1)
  552. return;
  553. Service_CloseSecureChannel(server, connection->channel);
  554. }
  555. /* Process binary message received from Connection dose not modify UA_ByteString
  556. * you have to free it youself. use of connection->getSendBuffer() and
  557. * connection->send() to answer Message */
  558. void UA_Server_processBinaryMessage(UA_Server *server, UA_Connection *connection, const UA_ByteString *msg) {
  559. size_t offset= 0;
  560. UA_TcpMessageHeader tcpMessageHeader;
  561. do {
  562. /* Decode the message header */
  563. UA_StatusCode retval = UA_TcpMessageHeader_decodeBinary(msg, &offset, &tcpMessageHeader);
  564. if(retval != UA_STATUSCODE_GOOD) {
  565. UA_LOG_INFO(server->config.logger, UA_LOGCATEGORY_NETWORK,
  566. "Decoding of message header failed on Connection %i", connection->sockfd);
  567. connection->close(connection);
  568. break;
  569. }
  570. if(tcpMessageHeader.messageSize < 16) {
  571. UA_LOG_INFO(server->config.logger, UA_LOGCATEGORY_NETWORK,
  572. "The message is suspiciously small on Connection %i", connection->sockfd);
  573. connection->close(connection);
  574. break;
  575. }
  576. /* Set the expected position after processing the chunk */
  577. size_t targetpos = offset - 8 + tcpMessageHeader.messageSize;
  578. /* Process the message */
  579. switch(tcpMessageHeader.messageTypeAndChunkType & 0x00ffffff) {
  580. case UA_MESSAGETYPE_HEL:
  581. UA_LOG_TRACE(server->config.logger, UA_LOGCATEGORY_NETWORK, "Connection %i | Process a HEL", connection->sockfd);
  582. processHEL(connection, msg, &offset);
  583. break;
  584. case UA_MESSAGETYPE_OPN:
  585. UA_LOG_TRACE(server->config.logger, UA_LOGCATEGORY_NETWORK, "Connection %i | Process a OPN", connection->sockfd);
  586. processOPN(connection, server, msg, &offset);
  587. break;
  588. case UA_MESSAGETYPE_MSG:
  589. #ifndef UA_ENABLE_NONSTANDARD_STATELESS
  590. if(connection->state != UA_CONNECTION_ESTABLISHED) {
  591. UA_LOG_DEBUG(server->config.logger, UA_LOGCATEGORY_NETWORK,
  592. "Connection %i | Received a MSG, but the connection is not established", connection->sockfd);
  593. connection->close(connection);
  594. return;
  595. }
  596. #endif
  597. UA_LOG_TRACE(server->config.logger, UA_LOGCATEGORY_NETWORK, "Connection %i | Process a MSG", connection->sockfd);
  598. processMSG(connection, server, &tcpMessageHeader, msg, &offset);
  599. break;
  600. case UA_MESSAGETYPE_CLO:
  601. UA_LOG_TRACE(server->config.logger, UA_LOGCATEGORY_NETWORK, "Connection %i | Process a CLO", connection->sockfd);
  602. processCLO(connection, server, msg, &offset);
  603. return;
  604. default:
  605. UA_LOG_TRACE(server->config.logger, UA_LOGCATEGORY_NETWORK, "Connection %i | Unknown chunk type", connection->sockfd);
  606. }
  607. /* Loop to process the next message in the stream */
  608. if(offset != targetpos) {
  609. UA_LOG_DEBUG(server->config.logger, UA_LOGCATEGORY_NETWORK, "Connection %i | Message was not entirely processed. "
  610. "Skip from position %i to position %i; message length is %i", connection->sockfd, offset, targetpos,
  611. msg->length);
  612. offset = targetpos;
  613. }
  614. } while(msg->length > offset);
  615. }