ua_stack_session.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. /*
  2. * ua_stack_session.c
  3. *
  4. * Created on: 05.06.2014
  5. * Author: root
  6. */
  7. #include <time.h>
  8. #include <stdlib.h>
  9. #include "ua_stack_session.h"
  10. struct UA_Session {
  11. UA_NodeId authenticationToken;
  12. UA_NodeId sessionId;
  13. UA_String name;
  14. Application *application;
  15. // UA_list_List pendingRequests;
  16. SL_Channel *channel;
  17. UA_UInt32 maxRequestMessageSize;
  18. UA_UInt32 maxResponseMessageSize;
  19. UA_Int64 timeout;
  20. UA_DateTime validTill;
  21. };
  22. /* mock up function to generate tokens for authentication */
  23. UA_Int32 UA_Session_generateToken(UA_NodeId *newToken) {
  24. //Random token generation
  25. UA_Int32 retval = UA_SUCCESS;
  26. srand(time(NULL));
  27. UA_Int32 i = 0;
  28. UA_Int32 r = 0;
  29. //retval |= UA_NodeId_new(newToken);
  30. newToken->nodeIdType = UA_NODEIDTYPE_GUID;
  31. newToken->ns = 0; // where else?
  32. newToken->identifier.guid.data1 = rand();
  33. r = rand();
  34. newToken->identifier.guid.data2 = (UA_UInt16)((r>>16) );
  35. r = rand();
  36. UA_Int32 r1 = (r>>16);
  37. UA_Int32 r2 = r1 & 0xFFFF;
  38. r2 = r2 * 1;
  39. newToken->identifier.guid.data3 = (UA_UInt16)((r>>16) );
  40. for(i=0;i<8;i++) {
  41. r = rand();
  42. newToken->identifier.guid.data4[i] = (UA_Byte)((r>>28) );
  43. }
  44. return retval;
  45. }
  46. UA_Int32 UA_Session_bind(UA_Session *session, SL_Channel *channel) {
  47. if(!channel || !session)
  48. return UA_ERROR;
  49. session->channel = channel;
  50. return UA_SUCCESS;
  51. }
  52. UA_Int32 UA_Session_new(UA_Session **newSession) {
  53. UA_Int32 retval = UA_SUCCESS;
  54. UA_Session *session;
  55. retval |= UA_alloc((void**)&session,sizeof(UA_Session));
  56. retval |= UA_alloc((void**)session,sizeof(UA_Session));
  57. *newSession = session;
  58. **newSession = *session;
  59. //get memory for request list
  60. return retval;
  61. }
  62. UA_Int32 UA_Session_deleteMembers(UA_Session *session) {
  63. UA_Int32 retval = UA_SUCCESS;
  64. retval |= UA_NodeId_deleteMembers(&session->authenticationToken);
  65. retval |= UA_String_deleteMembers(&session->name);
  66. retval |= UA_NodeId_deleteMembers(&session->sessionId);
  67. return retval;
  68. }
  69. UA_Int32 UA_Session_delete(UA_Session *session) {
  70. UA_Int32 retval = UA_SUCCESS;
  71. UA_Session_deleteMembers(session);
  72. retval |= UA_free(session);
  73. return retval;
  74. }
  75. UA_Int32 UA_Session_init(UA_Session *session, UA_String *sessionName, UA_Double requestedSessionTimeout,
  76. UA_UInt32 maxRequestMessageSize,
  77. UA_UInt32 maxResponseMessageSize,
  78. UA_Session_idProvider idProvider,
  79. UA_Int64 timeout){
  80. UA_Int32 retval = UA_SUCCESS;
  81. retval |= UA_String_copy(sessionName, &session->name);
  82. session->maxRequestMessageSize = maxRequestMessageSize;
  83. session->maxResponseMessageSize = maxResponseMessageSize;
  84. UA_Session_generateToken(&session->authenticationToken);
  85. idProvider(&session->sessionId);
  86. session->timeout = requestedSessionTimeout > timeout ? timeout : requestedSessionTimeout;
  87. UA_Session_updateLifetime(session);
  88. return retval;
  89. }
  90. UA_Boolean UA_Session_compare(UA_Session *session1, UA_Session *session2) {
  91. if(session1 && session2) {
  92. if (UA_NodeId_equal(&session1->sessionId, &session2->sessionId) == UA_EQUAL) {
  93. return UA_TRUE;
  94. }
  95. }
  96. return UA_FALSE;
  97. }
  98. UA_Boolean UA_Session_compareByToken(UA_Session *session, UA_NodeId *token) {
  99. if(session && token) {
  100. return UA_NodeId_equal(&session->authenticationToken, token);
  101. }
  102. return UA_NOT_EQUAL;
  103. }
  104. UA_Boolean UA_Session_compareById(UA_Session *session, UA_NodeId *sessionId) {
  105. if(session && sessionId) {
  106. return UA_NodeId_equal(&session->sessionId, sessionId);
  107. }
  108. return UA_NOT_EQUAL;
  109. }
  110. UA_Int32 UA_Session_getId(UA_Session *session, UA_NodeId *sessionId) {
  111. if(!session)
  112. return UA_ERROR;
  113. return UA_NodeId_copy(&session->sessionId, sessionId);
  114. }
  115. UA_Int32 UA_Session_getToken(UA_Session *session, UA_NodeId *authenticationToken) {
  116. if(!session)
  117. return UA_ERROR;
  118. return UA_NodeId_copy(&session->authenticationToken, authenticationToken);
  119. }
  120. UA_Int32 UA_Session_updateLifetime(UA_Session *session) {
  121. if(!session)
  122. return UA_ERROR;
  123. session->validTill = UA_DateTime_now() + session->timeout * 100000; //timeout in ms
  124. return UA_SUCCESS;
  125. }
  126. UA_Int32 UA_Session_getChannel(UA_Session *session, SL_Channel **channel) {
  127. if(!session)
  128. return UA_ERROR;
  129. *channel = session->channel;
  130. return UA_SUCCESS;
  131. }
  132. UA_Int32 UA_Session_getPendingLifetime(UA_Session *session, UA_Double *pendingLifetime_ms) {
  133. if(!session)
  134. return UA_ERROR;
  135. *pendingLifetime_ms = (session->validTill- UA_DateTime_now() ) / 10000000; //difference in ms
  136. return UA_SUCCESS;
  137. }
  138. UA_Boolean UA_Session_verifyChannel(UA_Session *session, SL_Channel *channel) {
  139. if(!session || !channel)
  140. return UA_FALSE;
  141. return SL_Channel_compare(session->channel, channel);
  142. }
  143. UA_Int32 UA_Session_getApplicationPointer(UA_Session *session, Application** application) {
  144. if(!session) {
  145. *application = UA_NULL;
  146. return UA_ERROR;
  147. }
  148. *application = session->application;
  149. return UA_SUCCESS;
  150. }
  151. UA_Int32 UA_Session_setApplicationPointer(UA_Session *session, Application* application) {
  152. if(!session)
  153. return UA_ERROR;
  154. session->application = application;
  155. return UA_SUCCESS;
  156. }