ua_session.c 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. /* This Source Code Form is subject to the terms of the Mozilla Public
  2. * License, v. 2.0. If a copy of the MPL was not distributed with this
  3. * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
  4. #include "ua_session.h"
  5. #include "ua_types_generated_handling.h"
  6. #include "ua_util.h"
  7. #ifdef UA_ENABLE_SUBSCRIPTIONS
  8. #include "server/ua_subscription.h"
  9. #endif
  10. UA_Session adminSession = {
  11. {{0, NULL},{0, NULL},
  12. {{0, NULL},{0, NULL}},
  13. UA_APPLICATIONTYPE_CLIENT,
  14. {0, NULL},{0, NULL},
  15. 0, NULL}, /* .clientDescription */
  16. {sizeof("Administrator Session")-1, (UA_Byte*)"Administrator Session"}, /* .sessionName */
  17. false, /* .activated */
  18. NULL, /* .sessionHandle */
  19. {0,UA_NODEIDTYPE_NUMERIC,{1}}, /* .authenticationToken */
  20. {0,UA_NODEIDTYPE_NUMERIC,{1}}, /* .sessionId */
  21. UA_UINT32_MAX, /* .maxRequestMessageSize */
  22. UA_UINT32_MAX, /* .maxResponseMessageSize */
  23. (UA_Double)UA_INT64_MAX, /* .timeout */
  24. UA_INT64_MAX, /* .validTill */
  25. {0, NULL},
  26. NULL, /* .channel */
  27. UA_MAXCONTINUATIONPOINTS, /* .availableContinuationPoints */
  28. {NULL}, /* .continuationPoints */
  29. #ifdef UA_ENABLE_SUBSCRIPTIONS
  30. 0, /* .lastSubscriptionID */
  31. 0, /* .lastSeenSubscriptionID */
  32. {NULL}, /* .serverSubscriptions */
  33. {NULL, NULL}, /* .responseQueue */
  34. 0, /* numSubscriptions */
  35. 0 /* numPublishReq */
  36. #endif
  37. };
  38. void UA_Session_init(UA_Session *session) {
  39. UA_ApplicationDescription_init(&session->clientDescription);
  40. session->activated = false;
  41. UA_NodeId_init(&session->authenticationToken);
  42. UA_NodeId_init(&session->sessionId);
  43. UA_String_init(&session->sessionName);
  44. UA_ByteString_init(&session->serverNonce);
  45. session->maxRequestMessageSize = 0;
  46. session->maxResponseMessageSize = 0;
  47. session->timeout = 0;
  48. UA_DateTime_init(&session->validTill);
  49. session->channel = NULL;
  50. session->availableContinuationPoints = UA_MAXCONTINUATIONPOINTS;
  51. LIST_INIT(&session->continuationPoints);
  52. #ifdef UA_ENABLE_SUBSCRIPTIONS
  53. LIST_INIT(&session->serverSubscriptions);
  54. session->lastSubscriptionID = 0;
  55. session->lastSeenSubscriptionID = 0;
  56. SIMPLEQ_INIT(&session->responseQueue);
  57. session->numSubscriptions = 0;
  58. session->numPublishReq = 0;
  59. #endif
  60. }
  61. void UA_Session_deleteMembersCleanup(UA_Session *session, UA_Server* server) {
  62. UA_ApplicationDescription_deleteMembers(&session->clientDescription);
  63. UA_NodeId_deleteMembers(&session->authenticationToken);
  64. UA_NodeId_deleteMembers(&session->sessionId);
  65. UA_String_deleteMembers(&session->sessionName);
  66. UA_ByteString_deleteMembers(&session->serverNonce);
  67. struct ContinuationPointEntry *cp, *temp;
  68. LIST_FOREACH_SAFE(cp, &session->continuationPoints, pointers, temp) {
  69. LIST_REMOVE(cp, pointers);
  70. UA_ByteString_deleteMembers(&cp->identifier);
  71. UA_BrowseDescription_deleteMembers(&cp->browseDescription);
  72. UA_free(cp);
  73. }
  74. if(session->channel)
  75. UA_SecureChannel_detachSession(session->channel, session);
  76. #ifdef UA_ENABLE_SUBSCRIPTIONS
  77. UA_Subscription *currents, *temps;
  78. LIST_FOREACH_SAFE(currents, &session->serverSubscriptions, listEntry, temps) {
  79. LIST_REMOVE(currents, listEntry);
  80. UA_Subscription_deleteMembers(currents, server);
  81. UA_free(currents);
  82. }
  83. UA_PublishResponseEntry *entry;
  84. while((entry = UA_Session_getPublishReq(session))) {
  85. UA_Session_removePublishReq(session,entry);
  86. UA_PublishResponse_deleteMembers(&entry->response);
  87. UA_free(entry);
  88. }
  89. #endif
  90. }
  91. void UA_Session_updateLifetime(UA_Session *session) {
  92. session->validTill = UA_DateTime_nowMonotonic() +
  93. (UA_DateTime)(session->timeout * UA_MSEC_TO_DATETIME);
  94. }
  95. #ifdef UA_ENABLE_SUBSCRIPTIONS
  96. void UA_Session_addSubscription(UA_Session *session, UA_Subscription *newSubscription) {
  97. session->numSubscriptions++;
  98. LIST_INSERT_HEAD(&session->serverSubscriptions, newSubscription, listEntry);
  99. }
  100. UA_StatusCode
  101. UA_Session_deleteSubscription(UA_Server *server, UA_Session *session,
  102. UA_UInt32 subscriptionID) {
  103. UA_Subscription *sub = UA_Session_getSubscriptionByID(session, subscriptionID);
  104. if(!sub)
  105. return UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID;
  106. LIST_REMOVE(sub, listEntry);
  107. UA_Subscription_deleteMembers(sub, server);
  108. UA_free(sub);
  109. if(session->numSubscriptions > 0) {
  110. session->numSubscriptions--;
  111. }
  112. else {
  113. return UA_STATUSCODE_BADINTERNALERROR;
  114. }
  115. return UA_STATUSCODE_GOOD;
  116. }
  117. UA_UInt32
  118. UA_Session_getNumSubscriptions( UA_Session *session ) {
  119. return session->numSubscriptions;
  120. }
  121. UA_Subscription *
  122. UA_Session_getSubscriptionByID(UA_Session *session, UA_UInt32 subscriptionID) {
  123. UA_Subscription *sub;
  124. LIST_FOREACH(sub, &session->serverSubscriptions, listEntry) {
  125. if(sub->subscriptionID == subscriptionID)
  126. break;
  127. }
  128. return sub;
  129. }
  130. UA_UInt32 UA_Session_getUniqueSubscriptionID(UA_Session *session) {
  131. return ++(session->lastSubscriptionID);
  132. }
  133. UA_UInt32
  134. UA_Session_getNumPublishReq(UA_Session *session) {
  135. return session->numPublishReq;
  136. }
  137. UA_PublishResponseEntry*
  138. UA_Session_getPublishReq(UA_Session *session) {
  139. return SIMPLEQ_FIRST(&session->responseQueue);
  140. }
  141. void
  142. UA_Session_removePublishReq( UA_Session *session, UA_PublishResponseEntry* entry){
  143. UA_PublishResponseEntry* firstEntry;
  144. firstEntry = SIMPLEQ_FIRST(&session->responseQueue);
  145. /* Remove the response from the response queue */
  146. if((firstEntry != 0) && (firstEntry == entry)) {
  147. SIMPLEQ_REMOVE_HEAD(&session->responseQueue, listEntry);
  148. session->numPublishReq--;
  149. }
  150. }
  151. void UA_Session_addPublishReq( UA_Session *session, UA_PublishResponseEntry* entry){
  152. SIMPLEQ_INSERT_TAIL(&session->responseQueue, entry, listEntry);
  153. session->numPublishReq++;
  154. }
  155. #endif